2010-05-11 13 views
5

Ho una tabella come questa:Come mappare una proprietà solo per uso HQL (in Hibernate)?

id | name | score 

mappato ad un POJO via XML con Hibernate. La colonna del punteggio mi serve solo in oder by - clausole in HQL. Il valore per la colonna del punteggio viene calcolato da un algoritmo e aggiornato ogni 24 ore tramite il processo batch SQL (JDBC). Quindi non voglio inquinare il mio POJO con proprietà che non ho bisogno in fase di runtime.

Per una singola colonna potrebbe non essere un problema, ma ho diverse colonne di punteggio diverse. C'è un modo per mappare una proprietà solo per uso HQL?

Ad esempio come questo:

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

in modo che io ancora posso fare questo:

from Pojo p order by p.score 

ma la mia implementazione POJO potrebbe essere questa:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

No Setter per score fornito o proprietà aggiunta all'implementazione.

utilizzando l'ultima versione di Hibernate per Java.

Aggiornamento:

In un mondo perfetto si può fare in questo modo (grazie a Pascal Thivent):

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

Ma nel nostro mondo reale esiste a bug since years cui nessuno sembra preoccuparsi. Quindi qualcuno ha suggerimenti per una soluzione alternativa?

+0

A proposito di questa cosa di noop, attenzione! Non farà parte dell'oggetto Java mappato, ma sarà comunque presente nella memoria HQL! Una volta volevo non ottenere un campo BLOB come parte del risultato perché stavano riempiendo la memoria Java ma doveva essere considerata nella query. Pensavo di essere al sicuro ma ho finito per ottenere errori OutOfMemory perché la query HQL stava ancora caricando tutti i BLOB, anche se non facevano parte dei risultati. – Icegras

risposta

3

È possibile utilizzare access="noop" nella vostra mappatura per specificare le proprietà di query di sola (che è un segreto, caratteristica non documentata, vedi HHH-552):

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

Update: Giusto per chiarire, con il seguenti entità:

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

    //... 
} 

E questa mappatura:

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

Il seguente frammento:

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

genera il seguente SQL:

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

E nel mio mondo reale, il test appena passa. Questo è stato testato con Hibernate Core 3.3.2.GA su Derby e HSQLDB. In altre parole, funziona sulla mia macchina (c).

Se non lo fa per te - e non intendo essere scortese, ma - in un mondo perfetto è necessario fornire un banco di prova che permette di riprodurre HHH-2925 come richiesto per 3 + anni. Fornire un modo per riprodurre un problema (non potrei) aumenta notevolmente le possibilità di risolverlo.

+0

sei sicuro di non aver abbandonato questa funzione? Ottengo un 'org.hibernate.PropertyNotFoundException' – ManBugra

+0

@ManBugra 100% sicuro che sia ancora lì (ho controllato Hibernate 3.2.5.ga, 3.3.2.GA, 3.5.1-Final) e non verrà rimosso. –

+0

con la mappatura suggerita ottengo una proprietà PropertyNotFoundException. Devo configurare questo accessorio in qualche modo? ci sono altre configurazioni richieste? – ManBugra

-1

Fornisce org.hibernate.PropertyNotFoundException perché potrebbe essersi dimenticato di specificare l'attributo type della proprietà in xml mapping. Provare.

Problemi correlati