2011-01-05 2 views
4

J'ai une table sur la base de données et je veux charger seulement quelques colonnes du jeu de résultats, car l'objet principal mappé dans Hibernate a une relation avec lui-même et l'objet est très gros . Je définissais une requête SQL native dans le fichier HBM:Charger uniquement certaines colonnes avec des requêtes SQL natives Hibernate

<sql-query name="query"> 
    <return alias="r" class="RawData"/>  
    <![CDATA[ 
     SELECT DESCRIPTION as {r.description} 
     FROM RAWD_RAWDATAS r  
     WHERE r.RAWDATA_ID=? 
     ]]> 
</sql-query> 

Cette requête échoue cependant avec l'erreur: ne pouvait pas lire la valeur de la colonne de jeu de résultats: RAWDATA1_14_0_; Nom de la colonne non valide Erreur SQL: 17006, SQLState: null, car Hibernate essaie de charger tous les champs du jeu de résultats. J'ai également trouvé un bogue dans Hibernate JIRA (http://opensource.atlassian.com/projects/hibernate/browse/HHH-3035). Quelqu'un sait comment accomplir cette tâche avec une solution de contournement?

+0

Une question similaire pourrait être utile http://stackoverflow.com/questions/4186828/doubt-regarding-jpa-namedquery/4191511 –

+0

Pourquoi ne faites-vous pas simplement un mappage classique des colonnes dont vous avez besoin, y compris RAWDATA_ID? Mappez-les sur un objet, puis travaillez sur cet objet pour récupérer uniquement le champ DESCRIPTION. – bluish

+0

Je ne peux pas le faire car la relation est la suivante: RawData -> RawData, donc RawData est lui-même lié. –

Répondre

2

Comme vous utilisez une requête SQL natif, vous devrez peut-être utiliser un transformateur de résultats:

http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Query.html#setResultTransformer(org.hibernate.transform.ResultTransformer)

Edit: La fonction JPA pour cela est décrit ici: http://download.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html

+0

euh non, presque certainement pas: c'est appliqué aux résultats après qu'ils ont été hydratés, juste avant qu'ils ne soient retournés à l'utilisateur. – araqnid

1

Si vous voulez sélectionner une propriété, pas une entité, spécifiez <return-scalar...>, par exemple:

<sql-query name="AdvertDisplayRule.fetchActiveRuleSet"> 
    <return alias="ad" entity-name="com.wahanda.service.media.domain.Advert" /> 
    <return-scalar column="view_count" type="integer" /> 
    <![CDATA[ 
    SELECT {ad.*}, avd.view_count 
    FROM adv.advert {ad} 
     LEFT OUTER JOIN adv.advert_view_distribution avd ON avd.advert_id = {ad}.advert_id 
    ]]> 
</sql-query> 
+0

Je ne veux sélectionner que certaines propriétés d'un objet, pas tout l'objet, car l'objet peut être très volumineux et je ne veux pas charger toute la collection d'objets associée. Je ne peux pas utiliser votre code car il renvoie une seule propriété, pas un objet avec une seule propriété remplie. –

+0

Vous pourriez utiliser un ResultTransformer pour créer votre objet et peupler la seule propriété ... Je pense que vous avez également mis le doigt sur pourquoi les collections non-paresseuses sont généralement une mauvaise idée aussi. – araqnid

Questions connexes