2010-05-11 3 views
5

i ont une table comme celui-ci:Comment mapper une propriété pour l'utilisation de HQL uniquement (dans Hibernate)?

id | name | score 

mis en correspondance avec un POJO via XML avec Hibernate. La colonne de score dont j'ai besoin seulement dans oder by - clauses dans HQL. La valeur de la colonne de score est calculée par un algorithme et mise à jour toutes les 24 heures via le traitement par lots SQL (JDBC). Donc, je ne veux pas polluer mon POJO avec des propriétés dont je n'ai pas besoin à l'exécution.

Pour une seule colonne qui peut ne pas poser de problème, mais j'ai plusieurs colonnes de score différentes. Existe-t-il un moyen de mapper une propriété pour l'utilisation de HQL uniquement?

Par exemple comme ceci:

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

afin que je puisse encore faire:

from Pojo p order by p.score 

mais ma mise en œuvre de POJO peut ressembler à ceci:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

Pas Setter pour score fourni ou la propriété ajoutée à la mise en œuvre. En utilisant la dernière version d'Hibernate pour Java.

Mise à jour:

Dans un monde parfait, il peut être fait comme celui-ci (grâce à Pascal Thivent):

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

Mais dans notre monde réel, il existe a bug since years que personne ne semble se soucier. Donc, quelqu'un a-t-il des suggestions pour une solution de contournement?

+0

À propos de cette chose noop, méfiez-vous! Il ne fera pas partie de l'objet Java mappé, mais il sera toujours présent dans la mémoire HQL! Une fois, je voulais ne pas obtenir un champ BLOB dans le cadre du résultat car ils remplissaient de la mémoire Java mais cela devait être pris en compte dans la requête. Je pensais que j'étais en sécurité mais j'ai fini par obtenir des erreurs OutOfMemory car la requête HQL chargeait toujours tous les BLOB, même s'ils ne faisaient pas partie des résultats. – Icegras

Répondre

3

Vous pouvez utiliser access="noop" dans votre application pour définir les propriétés de la requête uniquement (c'est un secret, fonction non documentée, voir HHH-552):

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

Mise à jour: Juste pour clarifier les choses, avec le Entité suivante:

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

    //... 
} 

Et cette mise en correspondance:

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

L'extrait suivant:

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

génère l'instruction SQL suivante:

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

Et dans mon monde réel, le test passe juste. Cela a été testé avec Hibernate Core 3.3.2.GA sur Derby et HSQLDB. En d'autres termes, cela fonctionne sur ma machine (c).

Si elle ne le fait pas pour vous - et je ne veux pas être impoli, mais - dans un monde parfait vous devez fournir un test permettant de reproduire HHH-2925 comme demandé pour plus de 3 ans. Fournir un moyen de reproduire un problème (je ne pouvais pas) augmente fortement les chances de le réparer.

+0

êtes-vous sûr qu'ils n'ont pas abandonné cette fonctionnalité? Je reçois un 'org.hibernate.PropertyNotFoundException' – ManBugra

+0

@ManBugra 100% sûr qu'il est toujours là (j'ai vérifié Hibernate 3.2.5.ga, 3.3.2.GA, 3.5.1-Final) et ne sera pas supprimé. –

+0

avec votre mapping suggéré, je reçois une PropertyNotFoundException. Ai-je besoin de configurer cet accesseur en quelque sorte? existe-t-il d'autres configurations requises? – ManBugra

-1

Il donne org.hibernate.PropertyNotFoundException, car vous avez peut-être oublié de spécifier l'attribut type de la propriété dans le mappage XML. Veuillez faire un essai.

Questions connexes