我在通过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>...
您正在捕捉任何可能的异常并将其转储到标准输出。你确定没有异常被记录? – 2011-02-15 21:49:01