10

キーが埋め込まれたエンティティがあります。エンティティにはフィールドとしてキーのみがあり、キーには 7 つのフィールドがあり、そのうちのいくつかは null になる可能性があります。

次のクエリを実行すると:

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

正しい数の結果が得られますが、各結果は null です (つまり、4000 個の null オブジェクトのリストを取得します)。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;
  }
}
4

4 に答える 4

9

一般に、複合 ID の一部として null 許容列を使用することは、おそらく良い考えではありません。私の場合、外部結合を使用して作成されたビューがあり、説明したのとまったく同じ問題に直面したため、それが必要でした。https://hibernate.atlassian.net/browse/HHH-1109で提供されている情報を使用して解決できました。この Hibernate Jira の添付ファイルで提供されている NullableStringType を使用しました。私が使用した複合IDクラスでは:

@Type(type = "nl.pinkroccade.quarant.common.model.hibernate.type.NullableStringType")
private String nullableField;
于 2012-03-17T21:10:59.123 に答える
1

例外なく同じ問題が発生し、クエリ結果と同じサイズの null のリストがありました。私は何かをコメントアウトし、別の EmbeddedId JPA と比較し始めました。ここに私が見つけたものがあります.EmbeddedIdのすべての列はnullではない必要があり、@AttributeOverrideおよび@Embedded idクラスの列にnullable = falseを追加します。PK クラスから null 列を削除します。

なぜこれが機能するのかわかりませんが、機能しました。

于 2011-09-29T22:02:15.117 に答える
0

user405935が言ったように、複合キーの一部として null 許容列を使用することはお勧めできません。

私はあなたと同じ状況にあり、問題はテーブルのエントリが複合キーの一部である列に NULL 値を持っていたため、実行時に埋め込みキーを作成できなかったことです。

ソリューション:

  1. それらの列を null 非許容にする、または
  2. 主キーとして使用する新しい列を追加する、または
  3. null 非許容列のみを使用して別の埋め込みキーを見つける
于 2014-11-13T12:53:23.263 に答える
0

null 値を持つ可能性のある列が含まれているため、問題に直面しています。複合キーに null 許容列を含めないでください。RDBMS の定義により、キーは null であってはなりません。各行を一意に識別できる列を再考し、それらを複合キーの一部にします。

于 2017-08-30T13:01:41.380 に答える