Базовая инструкция HQL всегда терпит неудачу - PullRequest
4 голосов
/ 08 ноября 2010

Я недавно начал пытаться использовать Hibernate, но делаю это в Netbeans.Это привело к тому, что мне пришлось использовать этот пример проекта , чтобы попытаться запустить меня.

К сожалению, на этапе "Перечисление названий фильмов и получение актеров с использованием HQL-запросов" мои HQL-запросы не дают результатов и вместо этого дают сбой, за исключением:

org.hibernate.exception.SQLGrammarException: could not execute query
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from limit 100' at line 1

Кажется, что HQL не генерирует правильные операторы MySQL, но я не могу понять, почему,пока я следовал примеру до буквы.

Я пытаюсь подключиться к локальной базе данных MySQL с именем 'sakila' со следующими деталями:

jdbc:mysql://localhost:3306/sakila

, что выглядитработать правильно, так как я могу просматривать таблицы из Netbeans без проблем.

Мой hibernate.cfg.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
  <session-factory>  
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>  
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property>  
    <property name="hibernate.connection.username">root</property>  
    <property name="hibernate.show_sql">true</property>  
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>  
    <property name="hibernate.current_session_context_class">thread</property>  
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>  
    <mapping resource="dvdrental/Language.hbm.xml"/>  
    <mapping resource="dvdrental/FilmActor.hbm.xml"/>  
    <mapping resource="dvdrental/FilmCategory.hbm.xml"/>  
    <mapping resource="dvdrental/Category.hbm.xml"/>  
    <mapping resource="dvdrental/Film.hbm.xml"/>  
    <mapping resource="dvdrental/Actor.hbm.xml"/>  
  </session-factory>  
</hibernate-configuration>

Когда я использую HQL-запросокно, SQL, который он генерирует, только когда-либо говорит «выберите из», что явно неправильно, но я не могу понять, почему это вызвано?

Редактировать 1: Запрос HQLвкладка, показывающая мой ввод

Image showing HQL Query tab

Ответы [ 5 ]

2 голосов
/ 18 июня 2013

Я думаю, что основная причина ошибки, как указано ранее from User, U в User должно быть в верхнем регистре / заглавными, поскольку Hibernate использует POJO. Я попытался перекомпилировать код, и он работает правильно для примера приложения Swing: https://netbeans.org/kb/docs/java/hibernate-java-se.html.

Однако редактор запросов HQL по-прежнему выдает эту ошибку. Странно, но кажется, что этот редактор ненадежен.

2 голосов
/ 11 ноября 2010

Совершенно глупая причина - я даже не думал о том, что не построил проект, поэтому пример кода в нижней части примера работал правильно (потому что он был предварительно скомпилирован).Работает без проблем.

0 голосов
/ 19 июня 2012

Совершенно глупая причина - я даже не думал о том, что не построил проект, поэтому пример кода в нижней части примера работал правильно (потому что он был предварительно скомпилирован).Работает без проблем.

У меня возникла точно такая же проблема, но я думаю, что ваше заявленное решение неверно.Даже ваш проект не скомпилирован, HQL покажет вам результаты.Следует быть осторожным с именем таблицы в файле hibernate.cfg.xml, так как оно должно совпадать в запросе (с учетом регистра), например, в вашем случае имя таблицы называется «Actor», поэтому

from Actor будетработа, а не from actor

0 голосов
/ 09 ноября 2010

Когда я использую окно HQL Query, SQL, который он генерирует, только когда-либо говорит «выберите из», что явно неверно, но я не понимаю, почему это вызвано?

Простой

from Film

является допустимым HQL и должен работать.Не могли бы вы попробовать без следующей строки:

<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

Не уверен, что это решит проблему, но в любом случае нет смысла использовать «старый» парсер.


Боюсь, это заменяет проблему новой.Теперь на вкладке SQL панели HQL отображается сообщение «Недопустимый запрос», и если я запускаю запрос, я получаю org.hibernate.hql.ast.QuerySyntaxException.Есть еще указатели?

Как я уже сказал, я не был уверен, что это решит проблему.Я хотел бы написать «простой» тест JUnit для проверки работоспособности установки.Но очевидная ошибка, подобная этой, в окне NetBeans HQL Query маловероятна, IMO.

0 голосов
/ 08 ноября 2010

Сообщение об ошибке 'from limit 100' из вашего опубликованного исключения говорит мне, что вы забыли добавить Film после from.Пожалуйста, предоставьте HQL-запрос, который выдает исключение.

Кстати: примеры в примере проекта являются плохой практикой.Вы никогда не должны использовать встроенные аргументы в запросах HQL:

from Film as film where film.filmId between '"+startID+"' and '"+endID+"'

Вы должны использовать параметры запроса:

Query q = session.createQuery("from Film as film where film.filmId between :startID and :endID");
q.setParameter("startID", startID);
q.setParameter("endID", endID); 
...