0

このような状況があります: Hibernate で JPA を使用しており、DB からデータを取得したいと考えています。残念ながら、一意の制約の 2 つの異なるセットがあります。1 つはデータベース テーブルにあり、もう 1 つは Java エンティティに少し異なります。そこにアクセスできないため、DBで変更できません。また、アプリケーションの他の部分でエラーが発生する可能性があるため、Javaエンティティで変更することもできません。

Oracle Database にはテーブルFooがあります。内部には、2 つの同様のレコードがあります。

テーブル

私のJavaエンティティは、パラメータに基づいてレコードが一意かどうかを決定します:

  1. リスト項目
  2. ACC_ID
  3. PLACE_ID
  4. インストール_ID
  5. DISM_DATE
  6. BOX_ID
  7. FOO_ID
  8. ACC_START_DATE

したがって、Foo エンティティに基づいて休止状態の選択クエリを実行した後、データベースからレコードを 1 つだけ取得します (java は、db からの両方の foo が同じであると考えているため)。

それは問題ありません (私は 1 つの結果を好む) が、これら 2 つのレコードのどちらを最後に取得するかをどうにかして指定できますか? この場合、ACTIVITY_FLAG = 'Y' (テーブルから最初ではなく、ランダムでもなく、最新でもない) で 1 つを取得したいとします。これは可能ですか?

現在、@Embeddable および @IdClass アノテーションを使用して、Java コードで一意のパラメーターを設定しています。

Foo.java クラス:

@Entity
@Table(name = "Foo")
@IdClass(FooPK.class)

public final class Foo {

   private Long       rowId;
   private Long       boxId;
   private Integer    fooNumber;
   private String     description;
   private BigDecimal upperReadoutDate;
   private BigDecimal upperReadoutDate;
   private String     activityFlag;
   private Long       accId;
   private Long       placeId;
   private Long       installationId;
   private Date       dismountingDate;
   private Date       accStartDate;

   @Id
   @Column(name = "FOO_ID")
   public Integer getFooNumber() {
      return fooNumber;
   }

   public void setFooNumber(Integer mFooNumber) {
      fooNumber = mFooNumber;
   }

   @Column(name = "DESCRIPTION")
   public String getDescription() {
      return description;
   }

   public void setDescription(String mDescription) {
      description = mDescription;
   }

   @Column(name = "D_READ_DATE")
      public BigDecimal getLowerReadoutDate() {
      return lowerReadoutDate;
   }

   public void setLowerReadoutDate(BigDecimal mLowerReadoutDate) {
      lowerReadoutDate = mLowerReadoutDate;
   }

   @Column(name = "U_READ_DATE")
   public BigDecimal getUpperReadoutDate() {
      return upperReadoutDate;
   }

   public void setUpperReadoutDate(BigDecimal mUpperReadoutDate) {
      upperReadoutDate = mUpperReadoutDate;
   }

   @Column(name = "ACTIVITY_FLAG")
   public String getActivityFlag() {
      return activityFlag;
   }

   public void setActivityFlag(String mActivityFlag) {
      activityFlag = mActivityFlag;
   }

   @Id
   @Column(name = "BOX_ID")
   public Long getBoxId() {
      return boxId;
   }

   public void setBoxId(Long mBoxId) {
      boxId = mBoxId;
   }

   @Column(name = "ROW_ID")
   public Long getRowId() {
      return rowId;
   }

   public void setRowId(Long mRowId) {
      rowId = mRowId;
   }

   @Id
   @Column(name = "ACC_ID")
   public Long getAccId() {
      return accId;
   }

   public void setAccId(Long mAccId) {
      accId = mAccId;
   }

   @Id
   @Column(name = "PLACE_ID")
   public Long getPlaceId() {
      return placeId;
   }

   public void setPlaceId(Long mPlaceId) {
      placeId = mPlaceId;
   }

   @Id
   @Column(name = "INSTALLATION_ID")
   public Long getInstallationId() {
      return installationId;
   }

   public void setInstallationId(Long mInstallationId) {
      installationId = mInstallationId;
   }

   @Id
   @Column(name = "DISM_DATE")
   public Date getDismountingDate() {
      return dismountingDate;
   }

   public void setDismountingDate(Date mDismountingDate) {
      dismountingDate = mDismountingDate;
   }

   @Column(name = "ACC_START_DATE")
   public Date getAccStartDate() {
      return accStartDate;
   }

   public void setKuStartDate(Date mKuStartDate) {
      kuStartDate = mKuStartDate;
   }

}

FooPK.java クラス:

@Embeddable
public class FooPK implements Serializable {

   private static final long serialVersionUID = xxxxxxxxxxxxxxxxxxxL;
   private Long              accId;
   private Long              placeId;
   private Long              installationId;
   private Long              boxId;
   private Integer           fooNumber;
   private Date              dismountingDate;
   private Date              accStartDate;

   @Column(name = "ACC_ID")
   public Long getAccId() {
       return accId;
   }

   public void setAccId(Long mAccId) {
       accId = mAccId;
   }

   @Column(name = "PLACE_ID")
   public Long getPlaceId() {
       return placeId;
   }

   public void setPlaceId(Long mPlaceId) {
       placeId = mPlaceId;
   }

   @Column(name = "INSTALLATION_ID")
   public Long getInstallationId() {
       return installationId;
   }

   public void setInstallationId(Long mInstallationId) {
       installationId = mInstallationId;
   }

   @Column(name = "DISM_DATE")
   public Date getDismountingDate() {
       return dismountingDate;
   }

   public void setDismountingDate(Date mDismountingDate) {
       dismountingDate = mDismountingDate;
   }

   @Column(name = "BOX_ID")
   public Long getBoxId() {
       return boxId;
   }

   public void setBoxId(Long mBoxId) {
       boxId = mBoxId;
   }

   @Column(name = "FOO_ID")
   public Integer getFooNumber() {
       return fooNumber;
   }

   public void setFooNumber(Integer mFooNumber) {
       fooNumber = mFooNumber;
   }

   @Column(name = "ACC_START_DATE")
   public Date getAccStartDate() {
       return accStartDate;
   }

   public void setAccStartDate(Date mAccStartDate) {
       accStartDate = mAccStartDate;
   }

}

アイデアをありがとう!

4

1 に答える 1