レコードのテーブルがあります (簡単にするためにセッターやその他の属性を省略しました):
@Entity
@Table(name="RECORD")
public class Record {
private long id;
@Id
@GeneratedValue
@Column(name="ID")
public long getId() {
return id;
}
}
記録衝突の表:
@Entity
@Table(name = "RECORD_COLLISION")
public class RecordCollision {
private long id;
private Record firstRecord;
private Record secondRecord;
@Id
@GeneratedValue
@Column(name = "ID")
public long getId() {
return id;
}
@ManyToOne()
@JoinColumn(name = "FIRST_RECORD")
public Record getFirstRecord() {
return firstRecord;
}
@ManyToOne()
@JoinColumn(name = "SECOND_RECORD")
public Record getSecondRecord() {
return secondRecord;
}
}
指定したレコードと衝突しているすべてのレコードを選択する必要があります。このHQLクエリを使用しようとしました:
SELECT CASE WHEN rc.firstRecord = :record THEN rc.secondRecord ELSE rc.firstRecord END
FROM RecordCollision rc
WHERE rc.firstRecord = :record OR rc.secondRecord = :record
指定されたレコードが列 firstRecord にある可能性があるため、CASE ステートメントを使用する必要があります。その場合、secondRecord を返す必要があり、その逆も同様です。
問題は、query.list() を実行した後、Record のインスタンスのリストを取得せず、Object のインスタンスを 1 つ含むリストを取得することです。Hibernate は、CASE ステートメントの結果を Record のインスタンスとして返す必要があることを認識していないようです。これはどのように行うべきですか?