我有一个带嵌入式密钥的实体。实体只有键作为字段,键有7个字段,其中一些可以为空。
当我运行以下查询时:
Criteria criteria = session.createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("id.profPropertyId", profileExtensionName));
Object obj = criteria.list();
log.info(obj);
return (List<ProfileExtensions>) obj;
我得到正确数量的结果,但每个结果都为空(即我得到4000个空对象的列表)。我尝试过使用HQL查询和标准,但它们都给出了相同的结果。
映射类是从现有数据库生成的。
为查询生成的SQL如下
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=?
看起来它应该返回正确的数据。
映射文件非常简单(并从架构生成:
// 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", column=@Column(name="PROF_KEY", nullable=false, length=36) ),
@AttributeOverride(name="profPropertyId", column=@Column(name="PROF_PROPERTY_ID", nullable=false, length=64) ),
@AttributeOverride(name="profExtKey", column=@Column(name="PROF_EXT_KEY", length=256) ),
@AttributeOverride(name="profName", column=@Column(name="PROF_NAME", length=256) ),
@AttributeOverride(name="profDataType", column=@Column(name="PROF_DATA_TYPE", length=64) ),
@AttributeOverride(name="profValue", column=@Column(name="PROF_VALUE", length=1024) ),
@AttributeOverride(name="profValueExtended", column=@Column(name="PROF_VALUE_EXTENDED") ) } )
public ProfileExtensionsId getId() {
return this.id;
}
public void setId(ProfileExtensionsId id) {
this.id = id;
}
}
答案 0 :(得分:8)
一般来说,将可空列作为复合id的一部分可能不是一个好主意。在我的情况下它是必需的,因为我有一个使用外连接创建的视图,我遇到了与你描述的完全相同的问题。我能够使用https://hibernate.atlassian.net/browse/HHH-1109上提供的信息解决它。我使用了这个Hibernate Jira附件中提供的NullableStringType。在我使用的复合id类中:
@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType")
private String nullableField;
答案 1 :(得分:1)
我有同样的问题没有异常和一个与查询结果大小相同的空值列表。我开始评论一些内容并与另一个EmbeddedId JPA进行比较。以下是我发现的内容,EmbeddedId中的所有列必须为非null,将nullable = false添加到@AttributeOverride和@Embedded id类中的列。从PK类中删除空列。
我不知道为什么会这样,但确实如此。
答案 2 :(得分:0)
正如 user405935 所说,将可空列作为复合键的一部分并不是一个好主意。
我和你的情况相同,问题是表中的条目在从我的复合键中获取的列上具有NULL值,因此它无法在运行时创建我的嵌入式键。 / p>
解决方案:
答案 3 :(得分:0)
您遇到问题,因为您已包含可能具有空值的列。 复合键中不包含可为空的列。通过RDBMS定义,键必须不为null。重新考虑可以唯一标识每一行的列,并使它们成为复合键的一部分。