2010-10-18 19 views
7

Tengo una entidad con una clave incrustada. La entidad solo tiene la clave como campo y la clave tiene 7 campos, algunos de los cuales pueden ser nulos.Lista nula devuelta desde la consulta de hibernación con el id. Integrado

Cuando funciono la siguiente consulta:

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

I obtener el número correcto de los resultados, pero cada resultado es nulo (es decir consigo una lista de 4000 objetos nulos). He intentado utilizar tanto una consulta HQL como criterios, pero ambos dan el mismo resultado.

Las clases de mapeo se generaron a partir de una base de datos existente.

El SQL generado por la consulta es la siguiente

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

parece que debería devolver los datos correctos.

El archivo de correlación es bastante simple (y generada a partir del esquema:.

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

¿Qué SQL se genera? También muestre su mapeo (simplificado si es posible) y la tabla. –

Respuesta

1

que tenía el mismo problema no es la excepción y una lista de valores nulos del mismo tamaño que el resultado de la consulta que comenzó comentando cosas y comparando con otro EmbeddedId JPA. Esto es lo que descubrí, todas las columnas en el EmbeddedId deben ser no nulas add nullable = false en Columns en @AttributeOverride y en la clase @Embedded id. Eliminar las columnas nulas de la clase PK.

No sé por qué funciona pero lo hizo.

+0

Para mí trabajó con la solución propuesta por Randy P, pero agrega los atributos que aceptan nulos a la clase NO PK con sus getters y setters. –

+0

¿Puedes poner un ejemplo Randy? por favor – joseaio

7

En general, probablemente no sea una buena idea tener columnas con nulos como parte de una identificación compuesta. En mi caso fue necesario porque tuve una vista creada usando la combinación externa y me enfrenté exactamente al mismo problema que usted describió. Pude resolverlo usando la información provista en https://hibernate.onjira.com/browse/HHH-1109. Utilicé NullableStringType provisto en el archivo adjunto a este Hiranate Jira. En mi clase de Identificación del compuesto utilicé:

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

El atributo de nullable que [describió] (https: // docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/type/NullableType.html) ha quedado obsoleto. – zionpi

+0

¡Gracias, funciona! – StefanTo

+2

enlace está roto :( – BlondCode

0

Como dijo "user405935", no es una buena idea tener columnas anulables como parte de su clave compuesta. Estaba en la misma situación que la suya y el problema era que las entradas de la tabla tenían valores NULL en las columnas que formaban parte de mi clave compuesta, por lo que no pude crear mi clave incrustada en tiempo de ejecución.

Soluciones: 1) hacer esas columnas no anulables o 2) añadir una nueva columna se utiliza como clave principal o 3) que una tercera clave incorporada usando solamente las columnas no anulables

0

Tiene problemas porque ha incluido columnas que pueden tener un valor nulo. No incluya columnas anulables en la clave compuesta. Por definición de RDBMS, una clave no debe ser nula. Repensar las columnas que pueden identificar de forma única cada fila y hacerlas parte de su clave compuesta.

Cuestiones relacionadas