我正在使用以下代码来使用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表中“联接”的,所以仍然可以使用单个查询来获得整个StructureLocationType行?

谢谢。

最佳答案

您不能从一个查询中获取多个对象。

但是您可以选择所需的列,然后迭代返回的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 {
    // ...
}


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

09-27 07:09