HQL-запрос - получение данных через соединение - PullRequest
1 голос
/ 16 февраля 2011

У меня проблемы с относительно простым HQL-запросом, вызываемым со страницы jsp через javaBean.Сейчас я просто готовлюсь к тестированию, чтобы убедиться, что я знаю, как сделать все, прежде чем я сойду с ума от своих страниц.

Проблема, с которой я сталкиваюсь (не зная, конечно, что я делаю, конечно), заключается в том, что функция getHighBidder не работает должным образом.Как указано ниже, Bid - это соединение между Пользователем и Предметом.Я хочу получить itemID и использовать его для поиска максимальной ставкиAmt в таблице ставок и возврата объекта UserID или пользователя, связанного с заявкой.Однако, когда я запускаю функцию в моей текущей настройке, она возвращает ноль, и я всегда получаю ошибку «Не удалось найти высокую цену для товара».

Я пробовал оба запроса (один закомментирован) в функции getHighBidder в редакторе запросов HQL в NetBeans, и он успешно возвращает экземпляр пользователя, который соответствует наибольшей ставке для указанного элемента.Вот почему я так растерялся, почему я получаю нулевые значения, когда я на самом деле тестирую запрос в jsp.

Я имел дело с этим уже пару дней и не могу получитьв любом месте.Любая помощь, советы, указатели или советы по хорошим учебным пособиям или ссылкам будут чрезвычайно признательны.Я чувствую, что как только я решу эту проблему, я смогу создать почти все функции, которые мне нужны для моего проекта.

--- EDIT --- Вот ошибка, которую выдает мне 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)

Вот часть страницы 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());

%>

Здесь вызывается компонент.Обратите внимание, что 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>...

1 Ответ

1 голос
/ 10 марта 2011

Если вы посмотрите на трассировку стека, вы увидите, что ошибка возникает, когда 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 генерирует исключение, когда пытается его проанализировать.

Надеюсь, это поможет!

Кейт.

...