在使用hibernate的时候,有时想要把查询结果自动映射为自定义类型或者Map类型,我们一般都会这样操作:
Query query = entityManager.createNativeQuery("sql")
.unwrap(NativeQuery.class)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
项目上用的是hibernate5.4,结果发现setResultTransformer方法自5.2版本已过时:
而且org.hibernate.Query接口也过时,官方文档推荐使用org.hibernate.query.Query,但是没有明确说明setResultTransformer方法的替代用法。当然,过时又不是现在不能用了,不追求完美的话还是按原来的方式用就可以,但是我们要知道原因。
百度了许久,答案基本上都是unwrap的时候使用实现类:
这样确实不提示过时了,但是我觉得既然被弃用肯定是有原因的,肯定是有更优的实现方式的,直接去那个问答网站上搜,果然搜到有用的干货。
The Hibernate 5.2 implementation of the DTO projection cannot materialize the DTO projection from the ResultSet without executing a secondary query. However, this is very bad to performance since it can lead to N+1 query issues.
大概意思是原来的实现方式会造成 N+1 query 问题。
This HQL limitation has been discussed, and Hibernate 6.0 new SQM parser might address this issue, so stay tuned!
6.0会解决的,等着瞧好吧。
Hibernate 6 has not been released yet. However, based on this issue ResultTransformer interface was split into the 2 functional interfaces: TupleTransformer and ResultListTransformer.
怎么解决才是要点,
使用示例如下:
List<PersonAndCountryDTO> personAndAddressDTOs = entityManager
.createQuery(
"select p, c.name " +
"from Person p " +
"join Country c on p.locale = c.locale " +
"order by p.id")
.unwrap( org.hibernate.query.Query.class )
.setResultTransformer(
new ResultTransformer() {
@Override
public Object transformTuple(
Object[] tuple,
String[] aliases) {
return new PersonAndCountryDTO(
(Person) tuple[0],
(String) tuple[1]
);
}
@Override
public List transformList(List collection) {
return collection;
}
}
)
.getResultList();
测试DTO,组合了Persion和Country:
public class PersonAndCountryDTO{
private final Person person;
private final String country;
public PersonAndCountryDTO(
Person person,
String country) {
this.person = person;
this.country = country;
}
public Person getPerson() {
return person;
}
public String getCountry() {
return country;
}
}
今天的文章关于减肥的好方法_hibernate 修改字段没生效分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69782.html