Hibernate:使用别名获取列

时间:2017-06-16 07:54:48

标签: java hibernate jpa orm

考虑这个简单的查询:

SELECT 1 as first, 2 as second

当使用Hibernate时,我们可以执行以下操作:

em.createNativeQuery(query).fetchResultList()

但是,似乎没有办法获取别名(或列名)。这对于创建List<Map<String, Object>>非常有用,其中每个地图都是带有别名的行,例如在这种情况下:[{first: 1, second: 2}]

有没有办法做类似的事情?

2 个答案:

答案 0 :(得分:2)

我建议采用一种可能满足您需求的方法。

在JPA 2.1中,有一个名为“结果集映射”的功能。

基本上你必须定义一个保存结果值的POJO类(必须使用构造函数传递所有值):

public class ResultClass{

    private String fieldOne;
    private String fieldTwo;

    public ResultClass(String fieldOne, String fieldTwo){
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }
}

然后你必须在你的一个实体上声明映射(无关紧要,它只需要是一个被解析的@Entity):

@SqlResultSetMapping(name="ResultMapping", classes = {
    @ConstructorResult(targetClass = ResultClass.class, 
    columns = {@ColumnResult(name="columnOne"), @ColumnResult(name="columnTwo")})
})

columnOnecolumnTwo是本机查询的select子句中声明的别名。

最后用于查询创建:

List<ResultClass> results = em.createNativeQuery(query, "ResultMapping").getResultList();

在我看来,这是更优雅和“高于一级”的解决方案,因为您不使用通用的Map键/值对,而是使用具体的POJO类。

答案 1 :(得分:1)

您可以使用ResultTransformer界面。实现自定义映射器以使用别名映射值。 这是示例https://vladmihalcea.com/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/

使用ResultTransformer,您可以轻松自定义结果集类型,尤其是在需要别名