gpt4 book ai didi

java - 如何使用 Hibernate 将 SQL 查询的结果最好地映射到非实体 Java 对象?

转载 作者:太空狗 更新时间:2023-10-29 22:39:41 24 4
gpt4 key购买 nike

我有一个名为 X 的 Hibernate 托管 Java 实体和一个 native SQL 函数 (myfunc),我沿着这些行从 Hibernate SQL 查询调用:

SQLQuery q = hibernateSession.createSQLQuery(
"SELECT *, myfunc(:param) as result from X_table_name"
);

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

我尝试过的:

  1. 我试过使用 q.addEntity(Y.class) 但是失败了:org.hibernate.MappingException:未知实体 com.mycompany.Y
  2. q.setResultTransformer(Transformers.aliasToBean(Y.class)); 但这失败了:org.hibernate.PropertyNotFoundException: Could not find setter for some_property。 X 有一个名为 someProperty 的字段,带有适当的 getter 和 setter,但在这种情况下,Hibernate 似乎没有将列名 (some_property) 映射到正确的字段名。
  3. q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); 返回一个 Map,但值并不总是 X 中相应字段所期望的类型。例如,X 中枚举和日期类型的字段不能直接从 SQL 查询返回的 Map 映射(它们是字符串)。

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

最佳答案

参见 chapter of the documentation about SQL queries .

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

并且您可以使用别名将结果映射到 bean 属性:

select t.some_property as someProperty, ..., myfunc(:param) as result from X_table_name t

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

List<Object[]> rows = query.list();
for (Object[] row : rows) {
Foo foo = new Foo((Long) row[0], (String) row[1], ...);
}

这避免了反射,并让您控制一切。

关于java - 如何使用 Hibernate 将 SQL 查询的结果最好地映射到非实体 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11852910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com