关于我昨天发布的一个问题:How to populate POJO class from custom Hibernate query?
谁能给我一个例子,说明如何在Hibernate中编写下面的SQL,并得到正确的结果?
SQL:
select firstName, lastName
from Employee
我想做的是,如果在Hibernate中可能的话,把结果放在它们自己的基类中:
class Results {
private firstName;
private lastName;
// getters and setters
}
我相信这在JPA中是可能的(使用EntityManager
),但我还没有弄清楚如何在Hibernate中做到这一点(使用SessionFactory
和Session
)。
我正试图更好地学习Hibernate,即使是这个“简单”的查询也被证明是令人困惑的,不知道Hibernate以什么形式返回结果,以及如何将结果Map到我自己的(基类)中。所以在DAO例程的最后,我会这样做:
List<Results> list = query.list();
返回Results
的List
(我的基类)。
9条答案
按热度按时间5kgi1eie1#
你不能在Hibernate 5和Hibernate 4(至少是Hibernate 4.3.6.Final)中使用上面的代码,因为有一个异常。
问题是Hibernate将列名的别名转换为大写--
firstName
变成了FIRSTNAME
。并尝试使用这种策略在DTO
中找到名为getFIRSTNAME()
的getter和settersetFIRSTNAME()
在Hibernate看来,只有
PropertyAccessStrategyMapImpl.INSTANCE
适合。在此之后,它尝试进行转换(Map)MyResults
。不知道,这是一个bug或功能。
如何解决
使用带引号的别名
使用自定义结果Transformer
解决这个问题的另一种方法--使用忽略方法名case的结果Transformer(将
getFirstName()
视为getFIRSTNAME()
)。你可以自己写或者使用FluentHibernateResultTransformer。不需要使用引号和别名(如果列名等于DTO名称)。只需从项目页面下载库(它不需要额外的jar):fluent-hibernate。
此Transformer也可用于嵌套投影:How to transform a flat result set using Hibernate
yuvru6vn2#
参见AliasToBeanResultTransformer:
结果转换器Transformer,允许将结果转换为用户指定的类,该类将通过setter方法或匹配别名的字段填充。
您修改的代码:
对于原生SQL查询,请参阅Hibernate文档:
13.1.5.返回非托管实体
可以将ResultTransformer应用于原生SQL查询,允许它返回非托管实体。
此查询指定:
CatDTO
的列表,该列表已被示例化并将NAME和BIRTHNAME的值注入到其相应的属性或字段中。3hvapo4f3#
你需要使用一个构造函数,并在hql中使用new。我让你的代码示例取自这个问题:hibernate HQL createQuery() list() type cast to model directly
那么你的总部
Java(使用Hibernate)
x7rlezfr4#
YMMV,但我发现关键因素是你必须确保在SELECT子句中的每个字段都使用SQL“AS”关键字作为别名。我从来不用在化名前加引号。此外,在SELECT子句中使用数据库中实际列的大小写和标点符号,在别名中使用POJO中字段的大小写。这在Hibernate 4和5中很有用。
如果你有多个表,你也可以在SQL中使用表别名。这个带有一个名为“Department”的附加表的人为示例在数据库字段名中使用了更传统的小写和下划线,而在POJO字段名中使用了 Camel 大小写。
qv7cva1a5#
java.lang.ClassCastException: "CustomClass" cannot be cast to java.util.Map.
当SQL查询中指定的列与Map类的列不匹配时,会出现此问题。
这可能是由于:
pu82cl6c6#
Hibernate 5.4中的JPQL案例:
4dc9hkyq7#
如果你有一个原生查询,这里的所有答案都使用了较新版本的Hibernate的过时方法,所以如果你使用的是5.1+,这是一条路要走:
0wi1tuuw8#
下面是一个忽略大小写的结果Transformer:
ubbxdtey9#
写作(存在这种类型的挑战与hibernate工作)
1.自定义查询
1.带有可选参数的自定义配置文件
1.将Hibernate自定义查询结果Map到自定义类。
我不是说自定义的JpaRepository接口,它扩展了SpringBoot上的JpaRepository,你可以用@Query ->编写自定义的Query,这里你不能用可选的参数编写查询,例如。如果param为null,则不将其追加到查询字符串中。你可以使用Hibernate的Criteria API,但由于性能问题,在他们的文档中不推荐使用。
但存在简单易出错且性能好的方法。
编写自己的QueryService类,这些方法将获取字符串(第一个和第二个问题的答案)SQL,并将结果Map到自定义类(第三个问题),其中包含任何关联@OneToMany,@ManyToOne..
用例-您可以编写关于查询参数的任何类型条件