このような状況があります: Hibernate で JPA を使用しており、DB からデータを取得したいと考えています。残念ながら、一意の制約の 2 つの異なるセットがあります。1 つはデータベース テーブルにあり、もう 1 つは Java エンティティに少し異なります。そこにアクセスできないため、DBで変更できません。また、アプリケーションの他の部分でエラーが発生する可能性があるため、Javaエンティティで変更することもできません。
Oracle Database にはテーブルFooがあります。内部には、2 つの同様のレコードがあります。
私のJavaエンティティは、パラメータに基づいてレコードが一意かどうかを決定します:
- リスト項目
- ACC_ID
- PLACE_ID
- インストール_ID
- DISM_DATE
- BOX_ID
- FOO_ID
- 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;
}
}
アイデアをありがとう!