Что не так с моим HQL-запросом? - PullRequest
1 голос
/ 19 декабря 2011

У меня проблема с HQL-запросом, и я не могу его найти. Может быть, кто-то здесь может мне помочь. Я искал весь форум и в Google, но не могу найти хороший ответ на мой вопрос.

Это карта моего класса. Размер:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 1, 2011 3:07:44 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="be.digihash.java.servlets.database.Size" table="Size" catalog="wielsbeeksebcdb">
        <id name="idSize" type="java.lang.Integer">
            <column name="idSize" />
            <generator class="identity" />
        </id>
        <property name="tshirtSize" type="string">
            <column name="tshirtSize" length="45" not-null="true" />
        </property>
        <bag lazy="true" cascade="all" name="users">
            <key column="idUser"/>
            <one-to-many class="be.digihash.java.servlets.database.User"/>
        </bag>
    </class>
</hibernate-mapping>

И я использую этот код, чтобы выбрать id = 1 в моей таблице.

List tshirtSize = null;
try {
    tx = session.beginTransaction();
    tshirtSize = session.createQuery("SELECT size.tshirtsize FROM Size as size WHERE size.idSize='" + s + "'").list();

} catch (Exception e) {
    System.out.println(e.getMessage());
}
return tshirtSize.get(0).toString();

Когда я запускаю этот код, я получаю исключение NullPointerException. И когда я запускаю этот запрос в Netbeans, я получаю сообщение об ошибке.

Запрос: `SELECT size.tshirtsize FROM Size как размер WHERE size.idSize = '1'`` ОШИБКА:

org.hibernate.QueryException: unexpected token: size.idSize.size [SELECT size.tshirtsize FROM be.digihash.java.servlets.database.Size as size WHERE size.idSize='1']
at org.hibernate.hql.classic.FromParser.token(FromParser.java:105)
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
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)

Что я делаю не так с моим запросом?

Кстати, FROM Size as size отлично работает для извлечения всех объектов Size в базе данных.

Ответы [ 4 ]

2 голосов
/ 19 декабря 2011

В случае целого числа вам не нужно добавлять кавычки.

Попробуйте следующим образом

 String hql = "SELECT size.tshirtsize FROM Size as size WHERE size.idSize=?";
 List tshirtSize= session.createQuery(hql).setString(0,"123").list(); 
 if(tshirtSize!=null && tshirtSize.size>0)
  { 
       return tshirtSize.get(0).toString();
  }
2 голосов
/ 19 декабря 2011

Удалите кавычки вокруг вашей переменной в HQL - это целое число (не строка):

"... WHERE size.idSize = " + s
1 голос
/ 19 декабря 2011

Старайтесь не использовать псевдоним size, так как это зарезервированное слово в HQL, используемое для получения размера коллекций (см. Документы Hibernate ).

Попробуйте использовать параметры запроса , они помогут вам в будущем.Также проверьте обнуляемость tshirtSize перед возвратом.Для вашего примера это будет хороший подход:

List tshirtSize = null;
try {
    tx = session.beginTransaction();
    Query query = session.createQuery("SELECT s.tshirtsize FROM Size as s WHERE s.idSize = :idSize");
    query.setInteger("idSize", s);
    tshirtSize = query.list();

} catch (Exception e) {
    System.out.println(e.getMessage());
}
if (tshirtSize != null) {
    return tshirtSize.get(0).toString();
}
return null; // return new ArrayList(); would be perfectly valid

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

0 голосов
/ 19 декабря 2011

попробуйте это: WHERE size.id = " + s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...