2010-05-11 19 views
5

Tengo una tabla como la siguiente:¿Cómo correlacionar una propiedad solo para HQL (en Hibernate)?

id | name | score 

asignan a un POJO a través de XML con Hibernate. La columna de puntaje solo necesito en oder by - cláusulas en HQL. El valor de la columna de puntaje se calcula mediante un algoritmo y se actualiza cada 24 horas mediante el proceso por lotes SQL (JDBC). Así que no quiero contaminar mi POJO con propiedades que no necesito en tiempo de ejecución.

Para una sola columna que puede no ser un problema, pero tengo varias columnas de puntaje diferentes. ¿Hay alguna manera de asignar una propiedad para el uso de HQL solamente?

Por ejemplo así:

<property name="score" type="double" ignore="true"/> 

de manera que todavía puedo hacer esto:

from Pojo p order by p.score 

pero mi aplicación POJO puedo tener este aspecto:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

Sin Setter de score provisto o propiedad agregada a la implementación.

utilizando la última versión de Hibernate para Java.

Actualización:

En un mundo perfecto se puede hacer así (gracias a Pascal Thivent):

<property name="score" access="noop" insert="false" update="false"/> 

Pero en nuestro mundo real existe a bug since years la que nadie parece preocuparse. Entonces, ¿alguien tiene alguna sugerencia para una solución alternativa?

+0

Sobre esta cosa de noop, ¡cuidado! No será parte del objeto Java mapeado, ¡pero aún estará presente en la memoria HQL! Una vez quise no obtener un campo BLOB como parte del resultado porque estaban llenando la memoria de Java pero tenía que considerarse en la consulta. Pensé que estaba a salvo, pero terminé recibiendo errores OutOfMemory porque la consulta HQL aún estaba cargando todos los BLOB, incluso si no formaban parte de los resultados. – Icegras

Respuesta

3

Puede utilizar access="noop" en su asignación para especificar propiedades de la consulta de sólo (que es un secreto, característica no documentada, ver HHH-552):

<property name="score" access="noop" insert="false" update="false" ... /> 

Actualización: Solo para aclarar, con el Entidad siguiente:

public class EntityWithHqlOnlyProperty implements Serializable { 
    private Long id; 
    private String name; 

    //... 
} 

Y este mapeo:

<?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="com.stackoverflow.q2812672.EntityWithHqlOnlyProperty" table="EntityWithHqlOnlyProperty"> 
     <id name="id" type="java.lang.Long"> 
      <column name="id" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" not-null="true" /> 
     </property> 
     <property name="score" type="double" access="noop" insert="false" update="false"/> 
    </class> 
</hibernate-mapping> 

El siguiente fragmento:

Query q = session.createQuery("from EntityWithHqlOnlyProperty e order by e.score"); 
List<EntityWithHqlOnlyProperty> resultList = q.list(); 
assertNotNull(resultList); 

genera el siguiente código SQL:

select 
    entitywith0_.id as id6_, 
    entitywith0_.name as name6_, 
    entitywith0_.score as score6_ 
from 
    EntityWithHqlOnlyProperty entitywith0_ 
order by 
    entitywith0_.score 

Y en mi mundo real, la prueba simplemente pasa. Esto ha sido probado con Hibernate Core 3.3.2.GA en Derby y HSQLDB. En otras palabras, funciona en mi máquina (c).

Si no lo hace para usted - y no me refiero a ser grosero, pero - en un mundo perfecto debe proporcionar un caso de prueba que permite reproducir HHH-2925 conforme a lo solicitado por más de 3 años. Proporcionar una forma de reproducir un problema (no pude) aumenta mucho las posibilidades de solucionarlo.

+0

¿estás seguro de que no abandonaron esta función? Obtengo una 'org.hibernate.PropertyNotFoundException' – ManBugra

+0

@ManBugra 100% seguro de que todavía está allí (revisé Hibernate 3.2.5.ga, 3.3.2.GA, 3.5.1-Final) y no será eliminada. –

+0

con su asignación sugerida obtengo una PropertyNotFoundException. ¿Debo configurar este acceso de alguna forma? ¿hay otras configuraciones requeridas? – ManBugra

-1

Proporciona org.hibernate.PropertyNotFoundException porque es posible que haya olvidado especificar el atributo de tipo de la propiedad en la asignación de xml. Pruebe.

Cuestiones relacionadas