2010-05-11 13 views
5

Ich habe eine Tabelle wie diese:Wie wird eine Eigenschaft nur für die HQL-Verwendung zugeordnet (in Hibernate)?

id | name | score 

zu einem POJO über XML mit Hibernate abgebildet. Die Score Spalte brauche ich nur in oder by - Klauseln in HQL. Der Wert für die Score-Spalte wird von einem Algorithmus berechnet und alle 24 Stunden über den SQL-Batch-Prozess (JDBC) aktualisiert. Also möchte ich meinen POJO nicht mit Eigenschaften verschmutzen, die ich zur Laufzeit nicht brauche.

Für eine einzelne Spalte, die kein Problem sein kann, aber ich habe mehrere verschiedene Score-Spalten. Gibt es eine Möglichkeit, eine Eigenschaft nur für die HQL-Verwendung zuzuordnen?

Zum Beispiel wie folgt aus:

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

, so dass ich dies noch tun können:

from Pojo p order by p.score 

aber meine POJO Umsetzung wie folgt aussehen:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

Kein Setter für score bereitgestellt oder Eigenschaft zur Implementierung hinzugefügt.

mit der neuesten Hibernate-Version für Java.

Update:

In einer perfekten Welt kann es so (dank Pascal Thivent) erfolgen:

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

Aber in unserer realen Welt gibt es a bug since years, die niemand zu kümmern scheint. Hat also jemand einen Vorschlag für einen Workaround?

+0

Über dieses noop Sache, passen Sie auf! Es wird nicht Teil des abgebildeten Java-Objekts sein, aber es wird weiterhin im HQL-Speicher vorhanden sein! Ich wollte einmal nicht ein BLOB-Feld als Teil des Ergebnisses bekommen, weil sie Java-Speicher füllten, aber es in der Abfrage berücksichtigt werden musste. Ich dachte, ich wäre sicher, aber es kam zu OutOfMemory-Fehlern, weil die HQL-Abfrage immer noch alle BLOBs geladen hat, auch wenn sie nicht Teil der Ergebnisse waren. – Icegras

Antwort

3

Sie access="noop" in Ihrem Mapping verwenden können, um Abfrage-only Eigenschaften (das ist ein Geheimnis, nicht dokumentierte Funktion finden Sie HHH-552) angeben:

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

Update: Nur um zu klären, mit der folgende Unternehmen:

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

    //... 
} 

Und diese Abbildung:

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

Der folgende Ausschnitt:

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

generiert die folgende SQL:

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

Und in meiner realen Welt, der Test gerade passiert. Dies wurde mit Hibernate Core 3.3.2.GA auf Derby und HSQLDB getestet. Mit anderen Worten, es funktioniert auf meiner Maschine (c).

Wenn es nicht für Sie tut - und damit meine ich nicht unhöflich sein, aber - in einer perfekten Welt Sie einen Testfall zur Verfügung stellen sollten ermöglicht HHH-2925 zu reproduzieren, wie für 3 + Jahre beantragt. Die Möglichkeit, ein Problem zu reproduzieren (das konnte ich nicht), erhöht die Wahrscheinlichkeit, dass es behoben wird.

+0

Sind Sie sicher, dass sie diese Funktion nicht aufgegeben haben? Ich bekomme eine 'org.hibernate.PropertyNotFoundException' – ManBugra

+0

@ManBugra 100% sicher, dass es immer noch da ist (ich habe Hibernate 3.2.5.ga, 3.3.2.GA, 3.5.1-Final überprüft) und wird nicht entfernt. –

+0

mit Ihrer vorgeschlagenen Zuordnung bekomme ich eine PropertyNotFoundException. Muss ich diesen Accessor irgendwie konfigurieren? Gibt es noch andere Konfigurationen? – ManBugra

-1

Es gibt org.hibernate.PropertyNotFoundException, weil Sie möglicherweise vergessen haben, das Type-Attribut der Eigenschaft in XML-Mapping anzugeben. Bitte versuchen Sie es.

Verwandte Themen