具有@Transient字段的JPA实体可以存储来自SQL查询ResultSet的数据吗?

时间:2011-10-21 05:14:05

标签: sql hibernate jpa

示例:

@Entity
class Table_A{
    @Id
    @generatedValue
    private long ID;

    @Column
    private String name;

    @Transient
    private String otherName;

    // getters and setters

    public long getID()
    { return ID;}
    public void setID(long ID)
    { this.ID = ID;}

     public String getName()
    { return Name;}
    public void setName(String name)
    { this.name = name;}

    public String getOtherName()
    { return otherName;}
    public void setOtherName(String otherName)
    { this.otherName = otherName;}
}

查询示例:

String sql = "SELECT Table_A.*, otherName 
FROM Table_A INNER JOIN Other_Table ON Table_A.id = Other_Table.id";

List<Table_A> = em.createNativeQuery(sql, Table_A.class).getResultList();

注意:

“otherName”列是Other_Table的字段。

Other_Table不是实体

问题:

问题是,我无法将“otherName”列结果存储到Table_A实体的@Transient字段中。有没有办法做到这一点?它总是返回null。

2 个答案:

答案 0 :(得分:1)

不,这是不可能的。但修复很明显:将Other_Table映射到实体,并在两个实体之间引入关联。被迫使用瞬态字段和SQL查询大多数时候都是JPA设计错误的标志。不要与JPA战斗。按照预期的方式使用它,一切都会更容易。

答案 1 :(得分:1)

问题在于您使用的createNativeQuery形式希望能够将结果直接放入您的班级Table_A - 但当然otherName不会地图。

如果您使用其他形式的createNativeQuery,即使用名为@SqlResultSetMapping的<{3}},则可能能够将otherName的值转换为{ {1}}你可以使用。看看the example here

我担心你可能仍然需要在某个时候手动拨打@ColumnResult: - (