Hibernate 从 4.3.6.Final 迁移到 5.0.9.Final 后的 HQL 查询问题
Posted
技术标签:
【中文标题】Hibernate 从 4.3.6.Final 迁移到 5.0.9.Final 后的 HQL 查询问题【英文标题】:HQL query problems after Hibernate migration from 4.3.6.Final to 5.0.9.Final 【发布时间】:2016-06-16 13:02:03 【问题描述】:我正在将应用程序从 Hibernate 4.3.6.Final 迁移到 5.0.9.Final,然后再迁移到 5.2.0.Final。 Currentley 我遇到了不使用完整限定名的 HQL 查询的问题。 应用程序结合使用 hibernate.cfg.xml 配置文件和用于每个对象类的 hbm.xml 映射文件。注释仅在也使用休眠搜索的类中使用。 对于数据选择,应用程序使用 HQL 查询,只有少数查询是条件查询。
以下 HQL 查询在 4.3.6 中完美运行:
Organization temp = (Organization) session.createQuery("FROM Organization o WHERE o.pid = "+pid).setMaxResults(1).uniqueResult();
在 5.0.9.Final 我得到以下异常:
java.lang.IllegalArgumentException: org.hibernate.QueryException: in expected: o [FROM Organization o WHERE o.pid = 5]
如果我按以下方式更改查询,一切都很好:
Organization temp = (Organization) session.createQuery("FROM at.nettania.dev.ntacadmin.core.organization.Organization o WHERE o.pid = "+pid).setMaxResults(1).uniqueResult();
但是,该应用程序有数百个查询,它们都以相同的方式编写,并且在文档中它们不使用完整的限定类名。所以我可能有配置问题,希望有人能给我建议。
Organization.hbm.xml 文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="at.nettania.dev.ntacadmin.core.organization.Organization" table="NTACADMIN_ORGANIZATION">
<id name="pid" type="int">
<column name="PID" />
<generator class="native" />
</id>
<property name="creationDate" type="java.util.Date">
<column name="CREATIONDATE" />
</property>
<property name="changeDate" type="java.util.Date">
<column name="CHANGEDATE" />
</property>
<property name="locale" type="java.util.Locale">
<column name="LOCALE" />
</property>
<property name="timeZoneId" type="java.lang.String">
<column name="TIMEZONEID" />
</property>
<property name="deleted" type="boolean">
<column name="DELETED" />
</property>
<property name="enabled" type="boolean">
<column name="ENABLED" />
</property>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="shortcut" type="java.lang.String">
<column name="SHORTCUT" />
</property>
</hibernate-mapping>
这就是当前 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 name="">
<!--
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
-->
<!--
Database configuration
-->
<property name="connection.url">jdbc:mysql://localhost/testing</property>
<property name="connection.username">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.password“>****</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.jdbc.batch_size">0</property>
<property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
<!-- thread is the short name for org.hibernate.context.ThreadLocalSessionContext and let Hibernate bind the session automatically to the thread -->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">false</property>
<!-- automatic creation of tables -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<!-- JDBC Batch Size -->
<property name="hibernate.jdbc.batch_size">20</property>
<!-- Organization mappings -->
<mapping class="at.nettania.dev.ntacadmin.core.organization.Organization" resource="at/nettania/dev/ntacadmin/core/organization/Organization.hbm.xml"/>
</session-factory>
</hibernate-configuration>
谢谢你, 弗洛里安
【问题讨论】:
你能粘贴整个xml文件吗?我从来没有遇到过必须放置实体的绝对包路径的问题 刚刚将完整的hbm.xml和hibernate.cfg.xml添加到原帖中。感谢您的帮助。 【参考方案1】:我认为您需要从映射标记中删除类属性。资源是使用xml文件时使用注释时使用的类。
【讨论】:
感谢您的建议,这就是有趣的原因,在 Hibernate 5.x.x 之前,这并没有导致问题。以上是关于Hibernate 从 4.3.6.Final 迁移到 5.0.9.Final 后的 HQL 查询问题的主要内容,如果未能解决你的问题,请参考以下文章