我最近开始尝试使用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查询标签
答案 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