0

レコードのテーブルがあります (簡単にするためにセッターやその他の属性を省略しました):

@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 のインスタンスとして返す必要があることを認識していないようです。これはどのように行うべきですか?

4

1 に答える 1

0

このような JPQL/HQL クエリは、select-case なしで記述できます。

SELECT DISTINCT(r) FROM Record r 
WHERE 
r.id in (SELECT rc1.firstRecord.id 
         FROM RecordCollision rc1 
         WHERE rc1.secondRecord = :record) 
OR 
r.id in (SELECT rc2.secondRecord.id 
         FROM RecordCollision rc2 
         WHERE rc2.firstRecord = :record)

1 つの衝突が 1 行のみで表示される場合は、DISTINCT必要ありません。

于 2014-01-26T10:56:48.880 に答える