2010-10-18 10 views
7

Ho un'entità con una chiave incorporata. L'entità ha solo la chiave come campo e la chiave ha 7 campi, alcuni dei quali possono essere nulli.Elenco nullo restituito dalla query di ibernazione con ID incorporato

Quando si esegue la seguente domanda:

Criteria criteria = session.createCriteria(getPersistentClass()); 
criteria.add(Restrictions.eq("id.profPropertyId", profileExtensionName)); 
Object obj = criteria.list(); 
log.info(obj); 
return (List<ProfileExtensions>) obj; 

ottengo il numero corretto di risultati, ma ogni risultato è nullo (cioè ho un elenco di 4000 oggetti nulli). Ho provato ad utilizzare sia una query HQL che i criteri, ma entrambi danno lo stesso risultato.

Le classi di mapping sono state generate da un database esistente.

L'SQL generato per la query è la seguente

select this_.PROF_DATA_TYPE as PROF1_14_0_, this_.PROF_EXT_KEY as PROF2_14_0_, 
     this_.PROF_KEY as PROF3_14_0_, this_.PROF_NAME as PROF4_14_0_, 
     this_.PROF_PROPERTY_ID as PROF5_14_0_, this_.PROF_VALUE as PROF6_14_0_, 
     this_.PROF_VALUE_EXTENDED as PROF7_14_0_ 
from EMPINST.PROFILE_EXTENSIONS this_ 
where this_.PROF_PROPERTY_ID=? 

sembra che dovrebbe restituire i dati corretti.

Il file di mapping è piuttosto semplice (e generato dallo schema:.

// Generated Oct 18, 2010 11:08:08 PM by Hibernate Tools 3.2.2.GA 
import javax.persistence.AttributeOverride; 
import javax.persistence.AttributeOverrides; 
import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.UniqueConstraint; 

@Entity 
@Table(name="PROFILE_EXTENSIONS" 
    ,schema="EMPINST" 
    , uniqueConstraints = @UniqueConstraint(columnNames={"PROF_KEY", "PROF_PROPERTY_ID"})) 
public class ProfileExtensions implements java.io.Serializable { 


private ProfileExtensionsId id; 

public ProfileExtensions() { 
} 

public ProfileExtensions(ProfileExtensionsId id) { 
    this.id = id; 
} 

@EmbeddedId 

@AttributeOverrides({ 
    @AttributeOverride(name="profKey", [email protected](name="PROF_KEY", nullable=false, length=36)), 
    @AttributeOverride(name="profPropertyId", [email protected](name="PROF_PROPERTY_ID", nullable=false, length=64)), 
    @AttributeOverride(name="profExtKey", [email protected](name="PROF_EXT_KEY", length=256)), 
    @AttributeOverride(name="profName", [email protected](name="PROF_NAME", length=256)), 
    @AttributeOverride(name="profDataType", [email protected](name="PROF_DATA_TYPE", length=64)), 
    @AttributeOverride(name="profValue", [email protected](name="PROF_VALUE", length=1024)), 
    @AttributeOverride(name="profValueExtended", [email protected](name="PROF_VALUE_EXTENDED")) }) 
    public ProfileExtensionsId getId() { 
    return this.id; 
    } 

    public void setId(ProfileExtensionsId id) { 
     this.id = id; 
    } 
} 
+0

Quale SQL viene generato? Si prega inoltre di mostrare la mappatura e la tabella (se possibile semplificata). –

risposta

1

Ho avuto lo stesso problema non fa eccezione e un elenco di valori nulli della stessa dimensione come il risultato della query ho iniziato commentando roba e confrontando con un altro JPA EmbeddedId. Ecco cosa ho scoperto, tutte le colonne in EmbeddedId devono essere non nulle aggiungono nullable = false a Columns su @AttributeOverride e nella classe ID @mbedded.Rimuovi colonne Null dalla classe PK.

Non so perché funzioni ma lo ha fatto.

+0

Per me ha lavorato con la soluzione proposta da Randy P, ma aggiungo gli attributi nullable alla classe NO PK con i suoi getter e setter. –

+0

puoi fare un esempio di Randy? per favore – joseaio

7

In generale, probabilmente non è una buona idea avere colonne nullable come parte dell'ID composito. Nel mio caso è stato necessario perché avevo una vista creata usando join esterno e ho affrontato esattamente lo stesso problema che hai descritto. Sono stato in grado di risolverlo utilizzando le informazioni fornite su https://hibernate.onjira.com/browse/HHH-1109. Ho usato NullableStringType fornito in allegato a questo Hibernate Jira. Nella mia classe id composito che ho usato:

@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType") 
private String nullableField; 
+0

L'attributo nullable che hai [descritto] (https: // docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/type/NullableType.html) è stato dichiarato obsoleto. – zionpi

+0

Grazie, funziona! Il collegamento – StefanTo

+2

è interrotto :( – BlondCode

0

come "user405935", ha detto, non è una buona idea avere colonne annullabili come una parte della vostra chiave composita. Ero nella stessa situazione del tuo e il problema era che le voci della tabella avevano valori NULL sulle colonne che hanno preso parte alla mia chiave composta, quindi non poteva creare la mia chiave incorporata in fase di runtime.

Soluzioni: 1) rendono queste colonne non null o 2) aggiungere una nuova colonna utilizzato come chiave primaria o 3) Trovare un altro tasto incorporato utilizzando solo le colonne non annullabili

0

Sei di fronte al problema perché hai incluso colonne che possono avere valore nullo. Non includere colonne annullabili nella chiave composta. Per definizione RDBMS, una chiave non deve essere nulla. Ripensa le colonne che possono identificare in modo univoco ogni riga e renderle parte della tua chiave composita.

Problemi correlati