2011-01-05 12 views
4

Ich habe eine Tabelle in der Datenbank und ich möchte nur einige Spalten aus der Ergebnismenge laden, weil das Hauptobjekt in Hibernate eine Beziehung mit sich selbst hat und das Objekt sehr groß ist . Ich definierte eine native SQL-Abfrage in der hbm Datei:Laden Sie nur einige Spalten mit Hibernate nativen SQL Abfragen

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

Diese Abfrage jedoch mit Fehlern fehlschlägt: konnte nicht Spalt Wert von Ergebnismenge gelesen: RAWDATA1_14_0_; Ungültiger Spaltenname SQL-Fehler: 17006, SQLState: null, weil Hibernate versucht, alle Felder aus der Ergebnismenge zu laden. Ich habe auch einen Fehler in Hibernate JIRA gefunden (http://opensource.atlassian.com/projects/hibernate/browse/HHH-3035). Kann jemand diese Aufgabe mit einer Problemumgehung lösen?

+0

Ähnliche Fragen könnten helfen http://stackoverflow.com/questions/4186828/doubt-regarding-jpa-namedquery/4191511 –

+0

Warum machen Sie nicht einfach eine klassische Zuordnung der Spalten, die Sie benötigen, inklusive RAWDATA_ID? Ordne sie einem Objekt zu und arbeite dann an diesem Objekt, um nur das DESCRIPTION-Feld abzurufen. – bluish

+0

Ich kann dies nicht tun, weil die Beziehung die folgenden ist: RawData -> RawData, so dass RawData selbst verknüpft ist. –

Antwort

2

Wie Sie eine native SQL-Abfrage verwenden, können Sie ein Ergebnis Transformator verwenden müssen:

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

Edit: Die PPV-Funktion für das ist hier beschrieben: http://download.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html

+0

uh nein, fast definitiv nicht: das wird auf die Ergebnisse angewendet, nachdem sie hydriert wurden, kurz bevor sie an den Benutzer zurückgegeben werden. – araqnid

1

Wenn Sie nur eine Eigenschaft und keine Entität auswählen möchten, geben Sie <return-scalar...> ein, z. B .:

<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

Ich möchte nur einige Eigenschaften eines Objekts auswählen, nicht das gesamte Objekt, weil das Objekt sehr groß sein kann und ich nicht die gesamte zugehörige Sammlung von Objekten laden möchte. Ich kann Ihren Code nicht verwenden, da er eine einzelne Eigenschaft und kein Objekt mit einer einzigen Eigenschaft zurückgibt. –

+0

Sie können einen ResultTransformer verwenden, um Ihr Objekt zu erstellen und die einzelne Eigenschaft aufzufüllen ... Ich denke, Sie haben auch darüber nachgedacht, warum nicht-lazy-loaded Sammlungen auch eine schlechte Idee sind. – araqnid

Verwandte Themen