示例:
@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。
答案 0 :(得分:1)
不,这是不可能的。但修复很明显:将Other_Table
映射到实体,并在两个实体之间引入关联。被迫使用瞬态字段和SQL查询大多数时候都是JPA设计错误的标志。不要与JPA战斗。按照预期的方式使用它,一切都会更容易。
答案 1 :(得分:1)
问题在于您使用的createNativeQuery形式希望能够将结果直接放入您的班级Table_A
- 但当然otherName
不会地图。
如果您使用其他形式的createNativeQuery,即使用名为@SqlResultSetMapping
的<{3}},则可能能够将otherName
的值转换为{ {1}}你可以使用。看看the example here。
我担心你可能仍然需要在某个时候手动拨打@ColumnResult
: - (