Kon*_*rer 6 hibernate hql dialect
我放弃并问社区......
在我的项目中,我使用的是Hibernate 3.6.4.Final和自定义sql方言:
public class ServiceAppMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public ServiceAppMySQL5InnoDBDialect() {
super();
registerFunction("bitwise_and", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "(?1 & ?2)"));
registerFunction("hasflags", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "?1 & ?2 = ?2"));
}
}
Run Code Online (Sandbox Code Playgroud)
hasflags在HQL查询中使用该方法失败.这是查询:
Query q = em
.createQuery(
"SELECT o FROM "
+ entityClass.getName()
+ " o WHERE hasflags(o.status, :status) AND o.email = :email")
.setParameter("email", username)
.setParameter("status", status.getBitmask());
Run Code Online (Sandbox Code Playgroud)
错误:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: ( near line 1, column 50 [SELECT o FROM tv.px.domain.Owner o WHERE hasflags(o.status, :status) AND o.email = :email]
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
Run Code Online (Sandbox Code Playgroud)
因此,似乎功能未正确注册.我已经使用较旧的Hibernate版本多次完成此操作,并且它一直以这种方式工作.
以防万一有人问:是的,我配置Hibernate使用方言:
<persistence-unit name="persistenceUnit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="tv.px.persistence.hibernate.ServiceAppMySQL5InnoDBDialect" />
<!-- and so on -->
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
编辑:在SELECT子句中,我可以使用已注册的函数而不会出现问题,但不能在WHERE子句中使用.
小智 14
我有一个类似的问题.如果您将where子句修改为:
hasflags(o.status, :status) = true
Run Code Online (Sandbox Code Playgroud)
我需要它在没有它的情况下工作,我对它的搜索把我带到了这里.
| 归档时间: |
|
| 查看次数: |
5968 次 |
| 最近记录: |