Hibernate createNativeQuery-获得多个实体

时间:2018-11-22 10:16:16

标签: java sql database hibernate

我正在使用以下代码通过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行?

谢谢。

2 个答案:

答案 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 {
    // ...
}

我认为有一种方法可以将查询映射到对象而不创建数据库视图,但现在找不到。