繁体   English   中英

Hibernate createNativeQuery - 获取多个实体

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM