返回休眠本机 sql 查询

Posted

技术标签:

【中文标题】返回休眠本机 sql 查询【英文标题】:hibernate native sql query returned 【发布时间】:2013-02-09 13:16:07 【问题描述】:

我想做一个原生 SQL 查询,它连接 2 个表。

返回值应该是 District Table 的所有元素,即 (id, name, district_code, coordinates),以及 District 中所有 Objects 的 count(*)(因此与其他一些表连接)。

所以我拥有(district.*) 区的所有列,其中一个字段是Count(*)。 我可以使用哪种查询,以便在我的 java 代码中使用它?我无法添加实体,或者因为 count(*) 不适合它!?

我有一个 District 类,如下所示:

@XmlRootElement
public class District extends AbstractEntity

    private int id;
    private String name;
    private int district_code;
    @Transient
    private int carsQuantity;

    public District()

    @Override
    public int getId() 
        return id;
    

    @Override
    public void setId(int id) 
        this.id = id;       
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getDistrict_code() 
        return district_code;
    

    public void setDistrict_code(int district_code) 
        this.district_code = district_code;
    

    public int getCarsQuantity() 
        return carsQuantity;
    

    public void setCarsQuantity(int carsQuantity) 
        this.carsQuantity = carsQuantity;
    

我的 District.hbm.xml:

<hibernate-mapping package="at.opendata.entitys">      
    <class name="District" table="districts">       
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
        <property name="name"/>
        <property name="district_code"/>                
    </class>    
</hibernate-mapping>

编辑:

我无法使用 HQL 或 JPQL,因为我的 FROM CLAUSE 中需要一个 SUBSELECT。

SELECT d.id, count(*) FROM (SELECT cd.coordinates AS coordinates FROM cars AS c LEFT JOIN cardetail AS cd ON (c.car_id = cd.car_id)) AS c CROSS JOIN districts AS d WHERE ST_CONTAINS(d.coordinates, c.coordinates) GROUP BY id

【问题讨论】:

【参考方案1】:

首先,您不需要本机查询。 JPQL 会做得很好。这种查询的结果将只是一个List&lt;Object[]&gt;,其中每个对象数组将包含每个返回列的元素。只需遍历这个列表,然后对元素做任何你想做的事情:

for (Object[] row : list) 
    Integer id = (Integer) row[0];
    String name = (String) row[1];
    ...
    Long count = (Long) row[4];
    ...

【讨论】:

感谢您的回答,但我需要一个本机 SQL 查询,因为我无法在 FROM 子句中进行内部选择。请看你自己: SELECT d.id, name, district_code, count(*) FROM (SELECT cd.coordinates AS coordinates FROM cars AS c LEFT JOIN cardetail AS cd ON (c.car_id = cd.car_id)) AS c CROSS JOIN Districts AS d WHERE ST_CONTAINS(d.coordinates, c.coordinates) GROUP BY id 这不会改变任何事情。 SQL 查询仍将返回 List,其中每行的第一个元素是 ID,第二个元素是名称,等等。

以上是关于返回休眠本机 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有连接的休眠自定义 SQL 查询 - 避免返回数组列表

getSingleResult 在休眠中返回本地标量查询的代理

休眠选择查询不返回任何内容

Spring - 当列名与模型中的名称不同时,本机查询与休眠混合

时间戳的休眠搜索查询返回空列表

如何使用休眠本机查询获取单个记录字符串值?