![](/img/trans.png)
[英]Hibernate - createNativeQuery with “non-entity class” result
[英]Hibernate createNativeQuery - get more than one Entity
我正在使用以下代碼通過休眠執行本機 SQL 查詢:
Query zonesQuery = session.createNativeQuery(
"Select * \n" +
"FROM dbo.Structure AS S\n" +
"JOIN dbo.StructureLocationType AS SLT ON SLT.StructureId = S.Id\n" +
"WHERE SLT.LocationTypeId = :lc").addEntity(StructureEntity.class);
zonesQuery.setParameter("lc", locationTypeID);
List<StructureEntity> zones = zonesQuery.list();
所以它起作用了,它讓我得到 StructureEntity 的列表
現在,因為我的 sql 查詢從 StructureLocationType 表“加入”,是否也有可能獲得整個 StructureLocationType 行,仍然使用單個查詢?
謝謝你。
可以通過以下方式實現(注意 SQL 中的花括號和實體別名):
Query query = session
.createNativeQuery(
"SELECT {S.*}, {SLT.*} " +
"FROM dbo.Structure AS S " +
"JOIN dbo.StructureLocationType AS SLT ON SLT.StructureId = S.Id " +
"WHERE SLT.LocationTypeId = :lc")
.unwrap(SQLQuery.class)
.addEntity("S", StructureEntity.class)
.addEntity("SLT", StructureLocationTypeEntity.class)
.setParameter("lc", locationTypeID);
List<Pair<StructureEntity, StructureLocationTypeEntity>> result = ((List<Object[]>) query.list())
.stream()
.map(p -> Pair.of((StructureEntity) p[0], (StructureLocationTypeEntity) p[1]))
.collect(Collectors.toList());
您無法從一個查詢中獲取多個對象。
但是你可以選擇你想要的列,然后迭代返回的 Object 數組:
查詢:
SELECT s.id, s.someColumn, slt.id, slt.structureId
FROM dbo.Structure AS s
JOIN dbo.StructureLocationType AS slt on slt.structureId = s.id
WHERE slt.locationTypeId = :lc
然后遍歷 Object 數組:
List<Object[]> result = query.getResultList();
或者你可以在你的數據庫上創建一個視圖,並使用 Table 注釋將它映射到一個 java 實體,就像它是一個普通的表:
@Entity
@Table(name = "STRUCTURE_LOCATION_TYPE_VIEW")
public class StructureAndLocationType {
// ...
}
我認為有一種方法可以在不創建數據庫視圖的情況下從查詢映射到對象,但現在找不到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.