我正在使用以下代码通过hibernate执行本机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表中进行的“ join”,是否有可能仍然使用单个查询来获得整个StructureLocationType行?
谢谢。
答案 0 :(得分:2)
可以通过以下方式实现(注意 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());
答案 1 :(得分:1)
您无法从一个查询中获取多个对象。
但是您可以选择所需的列,然后迭代返回的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 {
// ...
}
我认为有一种方法可以将查询映射到对象而不创建数据库视图,但现在找不到。