2011-02-15 76 views
1

我在通过javaBean从jsp页面调用相对简单的HQL查询时遇到了问题。我现在只是为了测试而设置一些东西,以确保我知道如何去做所有事情,然后才能让我的页面疯狂起来。HQL查询 - 通过连接关系提取数据

我遇到的问题(除了不知道我在做什么,当然是)函数getHighBidder工作不正常。如下所述,Bid是User和Item之间的连接。我想要一个itemID并使用它从Bid表中查找最大bidAmt并返回与该出价相关联的UserID或User对象。但是,当我在当前的设置中运行该函数时,它将返回null,并且总是会出现我的错误“无法找到Item的高出价者”。

我已经在NetBeans的HQL查询编辑器中的getHighBidder函数中尝试了两个查询(其中一个被注释掉),并且它成功返回与指定项目的最高出价匹配的User实例。这就是为什么我很困惑,为什么当我真正在jsp中测试查询时,我得到一个空值。

我已经处理了几天,现在似乎无法获得任何地方。任何帮助,提示,指针或建议良好的学习工具或参考将非常感激。我觉得一旦我解决了这个问题,我就可以创建我的项目所需的几乎所有功能。

---编辑--- 以下是错误的NetBeans吐我:

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) 

这里是我使用调用Bean中的JSP页面的一部分:

<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()); 

%> 

这是正在调用的bean。请注意,getItemByID在我当前的设置下工作得很好,返回Item对象以用于jsp页面。

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; 
    } 

... 

} 

我有以下的数据库设计:
=================================== ==================

User table: <br> 
PK USER_ID, <br> 
USER_NAME UNIQUE, <br> 
... 

Item table: <br> 
PK ITEM_ID, <br> 
FK ITEM_SELLER -> Many to One relationship with user.USER_ID, <br> 
FK ITEM_BUYER -> Many to One relationship with user.USER_ID, <br>... 

Bid table (bridge between user and item): <br> 
PK BID_ID, <br> 
FK BIDDER_ID -> Many to One relationship with user.USER_ID, <br> 
FK ITEM_ID -> Many to One relationship with item.ITEM_ID, <br>... 
+0

您正在捕捉任何可能的异常并将其转储到标准输出。你确定没有异常被记录? – 2011-02-15 21:49:01

回答

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 ... 

,因此Hibernate是抛出异常当它试图解析它。

希望帮助!

凯特。