首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Hibernate以最佳方式将SQL查询结果映射到非实体Java对象?

如何使用Hibernate以最佳方式将SQL查询结果映射到非实体Java对象?
EN

Stack Overflow用户
提问于 2012-08-08 03:40:50
回答 3查看 28K关注 0票数 17

我有一个名为X的Hibernate托管Java实体和一个本机SQL函数(myfunc),我从Hibernate SQL查询中调用了该函数,如下所示:

代码语言:javascript
复制
SQLQuery q = hibernateSession.createSQLQuery(
                     "SELECT *, myfunc(:param) as result from X_table_name"
             );

我想要做的是将这个查询返回的所有内容映射到一个名为Y的类(不一定由Hibernate管理)。Y应该包含X中的所有属性/字段以及myfunc返回的结果,例如,Y可以扩展X类并添加一个“result”字段。

我尝试过的:

我尝试过使用q.addEntity(Y.class),但失败的原因是:org.hibernate.MappingException: Unknown entity com.mycompany.Y

  • q.setResultTransformer(Transformers.aliasToBean(Y.class));,但失败的原因是:org.hibernate.PropertyNotFoundException: Could not find setter for some_property。X有一个名为someProperty的字段,带有适当的getter和setter,但是在这种情况下,Hibernate似乎不会将列名(some_property)映射到正确的字段name.

  • q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);返回一个映射,但是值并不总是X中相应字段所期望的类型。例如,X中类型为枚举和日期的字段不能直接从someProperty查询返回的映射中映射(其中它们是字符串)。

处理这种情况的合适方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-08 06:03:23

请参阅chapter of the documentation about SQL queries

您可以使用addScalar()方法来指定Hibernat应该为给定列使用哪种类型。

您可以使用别名将结果与bean属性进行映射:

代码语言:javascript
复制
select t.some_property as someProperty, ..., myfunc(:param) as result from X_table_name t

或者(虽然它需要几行代码,但这是我首选的解决方案),您可以简单地自己进行映射:

代码语言:javascript
复制
List<Object[]> rows = query.list();
for (Object[] row : rows) {
    Foo foo = new Foo((Long) row[0], (String) row[1], ...);
}

这就避免了反射,让你可以控制一切。

票数 16
EN

Stack Overflow用户

发布于 2016-03-21 10:40:30

很简单。将行转换为Map<String, Object>

代码语言:javascript
复制
final org.hibernate.Query q = session.createSQLQuery(sql);
q.setParameter("geo", geo);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
final List<Map<String, Object>> src = q.list();
final List<VideoEntry> results = new ArrayList<VideoEntry>(src.size());
for (final Map<String, Object> map:src) {
    final VideoEntry entry = new VideoEntry();
    BeanUtils.populate(entry, map);
    results.add(entry);
}
票数 7
EN

Stack Overflow用户

发布于 2015-03-01 16:56:34

首先,您需要在hibernate配置xml文件中声明实体,如下所示:Class=“你的实体的路径”

或者,您可以在进行查询之前以编程方式执行相同的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11852910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档