考虑这个简单的查询:
SELECT 1 as first, 2 as second
当使用Hibernate时,我们可以执行以下操作:
em.createNativeQuery(query).fetchResultList()
但是,似乎没有办法获取别名(或列名)。这对于创建List<Map<String, Object>>
非常有用,其中每个地图都是带有别名的行,例如在这种情况下:[{first: 1, second: 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")})
})
columnOne
和columnTwo
是本机查询的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,您可以轻松自定义结果集类型,尤其是在需要别名
时