2011-05-24 14 views
6

Estoy renunciar y pedir a la comunidad ...Hibernate 3.6: registerFunction en el dialecto SQL que no trabaja

En mi proyecto, estoy usando Hibernate 3.6.4.Final y un dialecto SQL personalizado:

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")); 
    } 

} 

Fallo el uso del método hasflags en una consulta HQL. Ésta es la consulta:

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()); 

El error:

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) 

Por lo tanto, parece como si la función no se ha registrado correctamente. Lo he hecho varias veces con versiones anteriores de Hibernate y funcionó de esta manera todo el tiempo.

Por si alguien se pregunta esto: sí, he configurado Hibernate para utilizar el dialecto:

<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> 

Editar: En la cláusula SELECT puedo usar las funciones registradas y sin problemas, pero no en la cláusula WHERE.

Respuesta

13

Tengo un problema similar. Funciona si modifica la cláusula dónde:

hasflags(o.status, :status) = true 

necesito que funcione sin eso, y mi búsqueda de ella me trajo aquí.