【问题标题】:Hibernate: Fetching columns with their aliasesHibernate:使用别名获取列
【发布时间】:2017-06-16 07:54:48
【问题描述】:

考虑这个简单的查询:

SELECT 1 as first, 2 as second

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

em.createNativeQuery(query).fetchResultList()

但是,似乎无法获取别名(或列名)。这对于创建 List<Map<String, Object>> 非常有帮助,其中每个映射都是带有别名的一行,例如在本例中:[{first: 1, second: 2}]

有没有办法做这样的事情?

【问题讨论】:

    标签: java hibernate jpa orm


    【解决方案1】:

    我会建议一些不同的方法来满足您的需求。

    在 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. 在类中,在映射和查询中。老实说,我想避免映射,以便将别名直接映射到类上。我也不喜欢@SqlResultSetMapping 必须在完全不同的类上注释的事实。在我看来有趣的是AliasToBeanConstructorResultTransformer,但它仅适用于条件查询。
    【解决方案2】:

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

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

    【讨论】:

    • 这篇文章真的很有帮助——我之前尝试过使用ResultTransformer,但没有效果。正是我需要的。
    • 使用对象包装器而不是原语。你用什么数据库?oracle,mysql,postgressql...有些类型可能有问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2014-09-27
    • 2013-12-01
    相关资源
    最近更新 更多