基本HQL语句总是失败

时间:2010-11-08 19:04:00

标签: java hibernate orm hql

我最近开始尝试使用Hibernate,但我在Netbeans中这样做。这让我不得不使用this example project来尝试启动并运行。

不幸的是,在步骤“枚举电影片名和使用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语句,但我似乎无法理解为什么,因为到目前为止,我已经按照示例的说法进行了操作。

我正在尝试连接到名为“sakila”的本地MySQL数据库,其中包含以下详细信息:

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 个答案:

答案 0 :(得分:2)

完全愚蠢的理由 - 我甚至没有想过我没有构建项目的事实,所以示例底部的示例代码运行正常(因为它是预编译的)。现在没问题。

答案 1 :(得分:2)

我认为错误的主要原因如前所述from User,用户中的U应该是大写/大写,因为hibernate使用POJO。我尝试重新编译代码,它适用于示例Swing应用程序:https://netbeans.org/kb/docs/java/hibernate-java-se.html

但是HQL查询编辑器仍然会出现此错误。这很奇怪但似乎这个编辑器不可靠。

答案 2 :(得分:0)

发布的异常中的错误消息'from limit 100'告诉我,您忘记在Film之后添加from。请提供抛出异常的HQL查询。

BTW:示例项目中的示例是不好的做法。永远不要在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); 

答案 3 :(得分:0)

  

当我使用HQL查询窗口时,它似乎生成的SQL只会说'选择'这显然是错误的,但我不明白为什么会造成这种情况?

一个简单的

from Film

是有效的HQL,应该可以使用。你可以尝试没有以下一行:

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

不确定这会解决问题,但无论如何都没有理由使用“旧”解析器。


  

用一个我害怕的新问题取代了这个问题。现在,HQL窗格的SQL选项卡报告“无效查询”,如果我运行查询,则会得到org.hibernate.hql.ast.QuerySyntaxException。还有什么指示?

正如我所说,我不确定这会解决问题。我要做的是编写一个“简单”的JUnit测试来验证设置是否正常工作。但是,IMO不太可能在NetBeans HQL查询窗口中出现这样的明显错误。

答案 4 :(得分:0)

  

完全愚蠢的理由 - 我甚至没有想过我没有构建项目的事实,所以示例底部的示例代码运行正常(因为它是预编译的)。现在没问题。

我遇到了完全相同的问题,但我认为您声明的解决方案不正确。即使您的项目未编译,HQL也会向您显示结果。 应该注意hibernate.cfg.xml文件中的表名 因为它在查询中应该是相同的(区分大小写)也是例如在你的情况下它的表名为“Actor”所以

from Actor将有效,而不是from actor