从具有嵌入id的hibernate查询返回的空列表

从具有嵌入id的hibernate查询返回的空列表,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我有一个带有嵌入密钥的实体。实体只有键作为字段,键有7个字段,其中一些字段可以为空 当我运行以下查询时: Criteria criteria = session.createCriteria(getPersistentClass()); criteria.add(Restrictions.eq("id.profPropertyId", profileExtensionName)); Object obj = criteria.list(); log.info(obj); return (List

我有一个带有嵌入密钥的实体。实体只有键作为字段,键有7个字段,其中一些字段可以为空

当我运行以下查询时:

Criteria criteria = session.createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("id.profPropertyId", profileExtensionName));
Object obj = criteria.list();
log.info(obj);
return (List<ProfileExtensions>) obj; 
看起来它应该返回正确的数据

映射文件非常简单(并且是从模式生成的:

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

我遇到了同样的问题,没有例外,并且有一个与查询结果大小相同的空列表。我开始注释内容并与另一个EmbeddedId JPA进行比较。我发现,EmbeddedId中的所有列都必须为非空。将nullable=false添加到@AttributeOverride和@Embedded id类中的列。从我是PK班的


我不知道为什么会这样,但它确实起了作用。

一般来说,将可为null的列作为复合id的一部分可能不是一个好主意。在我的例子中,它是必需的,因为我有一个使用外部联接创建的视图,并且我遇到了与您描述的完全相同的问题。我能够使用上提供的信息来解决它。我使用了可为null的Stringty此Hibernate Jira的附件中提供了pe。在我的复合id类中,我使用了:

@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType")
private String nullableField;
正如user405935所说,将可空列作为复合键的一部分不是一个好主意

我的情况与您的相同,问题是表中的条目在参与我的复合键的列上有空值,因此它无法在运行时创建我的嵌入键

解决方案:

  • 使这些列不可为null,或
  • 添加用作主键的新列,或
  • 仅使用不可为空的列查找另一个嵌入键

  • 您正面临这个问题,因为您包含了可能具有空值的列。
    不要在复合键中包含可为null的列。根据RDBMS定义,键必须不为null。重新考虑可以唯一标识每一行并使其成为复合键一部分的列。

    生成了什么SQL?还请显示您的(如果可能,请简化)映射和表。对于我来说,使用Randy P提出的解决方案,但使用其getter和setter将可空属性添加到NO-PK类中。你能举个例子Randy吗?请不要使用你不赞成的可空属性。
    @Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType")
    private String nullableField;