0

我有一个记录表(为简单起见,我省略了 setter 和其他属性):

@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

我需要使用 CASE 语句,因为指定的记录可以在 firstRecord 列中,在这种情况下我需要返回 secondRecord,反之亦然。

问题是,在执行 query.list() 之后,我没有得到 Record 实例的列表,而是包含一个 Object 实例的列表。似乎 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)

如果一次冲突仅由一行呈现,则DISTINCT不需要。

于 2014-01-26T10:56:48.880 回答