2011-02-15 2 views
1

비교적 간단한 HQL 쿼리가 jsp 페이지에서 javaBean을 통해 호출되는 데 문제가 있습니다. 나는 지금 막 시험하기를위한 준비를하고 있으며, 모든 일을하는 법을 알고 있는지 확인하기 전에 내 페이지에 열중하고있다.HQL 쿼리 - 조인 관계를 통해 데이터 가져 오기

내가 겪고있는 문제는 getHighBidder가 제대로 작동하지 않는다는 것입니다. 아래에 설명 된대로 입찰은 사용자와 항목 간의 조인입니다. itemID를 가지고 입찰가 테이블에서 최대 bidAmt를 찾고 입찰가와 관련된 UserID 또는 User 객체를 반환하고 싶습니다. 그러나 현재 설정에서 함수를 실행하면 null이 반환되고 항상 "Item에 대해 높은 입찰자를 찾지 못했습니다."라는 오류가 발생합니다.

NetBeans의 HQL 쿼리 편집기에있는 getHighBidder 함수에서 두 쿼리 (주석 처리 됨)를 모두 시도하고 지정된 항목에 대한 가장 높은 입찰가와 일치하는 User 인스턴스를 성공적으로 반환합니다. 그래서 왜 내가 jsp에서 실제로 쿼리를 테스트 할 때 null 값을 얻는 지 혼란 스럽습니다.

저는 지금 며칠 동안이 문제를 다루었으며 아무데도 갈 수 없습니다. 도움, 힌트, 조언, 좋은 학습 도구 또는 참고 자료에 대한 조언은 극명하게 평가 될 것입니다. 이 문제가 해결되면 필자는 프로젝트에 필요한 거의 모든 기능을 만들 수있을 것입니다.

은 --- 편집 --- 여기 는 NetBeans는 나에게 오류를 뱉어된다

<jsp:useBean id="test" class="GavelDB.GavelDBHelper" scope="page"> 
<% 
... 

user = test.getHighBidder(item.getItemId()); 

if(user == null) 
    out.println("Failed to find high bidder for Item"); 
else 

    out.println("Successfully selected User Number " + user.getUserId() + ": " + user.getUserName()); 

%> 

:

at org.hibernate.hql.classic.PathExpressionParser.token(PathExpressionParser.java:130) 
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28) 
at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:176) 
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86) 
at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:113) 
at org.hibernate.hql.classic.PreprocessingParser.end(PreprocessingParser.java:122) 
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:29) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) 
at $Proxy59.createQuery(Unknown Source) 
at GavelDB.GavelDBHelper.getHighBidder(GavelDBHelper.java:99) 
at org.apache.jsp.index_jsp._jspService(index_jsp.java:109) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864) 
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1600) 

여기에 내가 빈 전화를 사용하고있는 JSP 페이지의 일부입니다 다음은 호출되는 bean입니다. getItemByID는 jsp 페이지에서 사용할 Item 객체를 반환하는 현재 설정에서 올바르게 작동합니다.

public class GavelDBHelper 
{ 
    Session session = null; 

... 

public Item getItemByID(int itemID) 
    { 
     Item item = null; 
     try 
     { 
      org.hibernate.Transaction tx = session.beginTransaction(); 
      Query q = session.createQuery (
         "from Item as item where item.id = '" + itemID + "'"); 
      item = (Item)q.uniqueResult(); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return item; 
    } 

    public User getHighBidder(int itemID) 
    { 
     User highBidder = null; 
     try 
     { 
      org.hibernate.Transaction tx = session.beginTransaction(); 
      Query q = session.createQuery (
         "select user" + 
         "from User as user, Bid as bid" + 
         "where user.id = bid.user.id and bid.bidAmt in(" + 
             "select max(b.bidAmt)" + 
             "from Bid as b" + 
             "where b.item.id = '" + itemID + "')"); 
      /*Query q = session.createQuery (
         "select bid.user"+ 
         "from Bid as bid"+ 
         "where bid.bidAmt in("+ 
             "select max(b.bidAmt)"+ 
             "from Bid as b"+ 
             "where b.item.id = '"+ itemID +"')");*/ 
      highBidder = (User)q.uniqueResult(); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return highBidder; 
    } 

... 

} 

나는 다음과 같은 데이터베이스 디자인을 가지고 :
를 =================================== ==================

+0

가능한 예외를 잡아서 표준 출력으로 넘깁니다. 예외가 기록되지 않았습니까? –

+0

예, 예외가 있습니다 ... 나는 넷빈즈에 익숙하지 않아서 내가 그렇게 생각해야합니다. 그래서 나는 그것을 깨닫지 못했습니다. 내가보기에 당신을 위해 메인 포스트에 오류를 게시했습니다. 바라건대 오늘 밤 좀 더 자세히 살펴 보도록하겠습니다. – Scott

답변

1

스택 추적을 보면 Hibernate에서 쿼리 문자열을 처리 할 때 오류가 발생하는 것을 볼 수 있습니다.

이 보면 :

 Query q = session.createQuery (
        "select user" + 
        "from User as user, Bid as bid" + 
        "where user.id = bid.user.id and bid.bidAmt in(" + 
            "select max(b.bidAmt)" + 
            "from Bid as b" + 
            "where b.item.id = '" + itemID + "')"); 

당신은 그래서 당신이 구축하는 쿼리 문자열의 모습 합치하는 문자열 사이에 공백이 없다 : 최대 절전 모드 따라서

select *userfrom* User as user, Bid as *bidwhere* user.id = bid.user.id and bid.bidAmt *in(select max(b.bidAmt)from* Bid as *bwhere* b.item.id ... 

과 예외를 던지고있다 그것을 파싱하려고 할 때.

희망 하시겠습니까?

케이트.