【发布时间】:2022-01-04 10:53:13
【问题描述】:
我遇到了一个特殊的用例。
这个需求很容易解释:我想查询一个 SQL 视图,并且视图中连接的表没有被任何实体跟踪,也不应该被跟踪。 我想使用 EntityManager 并将结果自动映射到我的 DTO/POJO。
到目前为止我没有成功的尝试:
-
使用
em.createNativeQuery("select .... from MyView",MyDto.class);Results in Caused by: org.hibernate.MappingException: Unknown entity: MyDto.class -
另外使用SqlResultSetMapping
@Data @SqlResultSetMapping(name = "MyDto", classes = { @ConstructorResult(targetClass = MyDto.class, columns = { @ColumnResult(name = "id") }) }) @AllArgsConstructor public class MyDto implements Serializable {Does not work either -
将 unwrap 与 createNativeQuery Transformers.aliasToBean 一起使用
em.createNativeQuery("") .unwrap(SQLQuery.class) .setResultTransformer(Transformers.aliasToBean(MyDto.class));Results in syntax error near "." for whatever reason. -
将 unwrap 与 createNativeQuery 和 AliasToEntityMapResultTransformer 一起使用
em.createNativeQuery("") .unwrap(SQLQuery.class) .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)Results in syntax error near "." for whatever reason as well.
除此之外,setResultTransformer 方法似乎已弃用。
我目前针对较小 DTO 的方法是手动映射,但如何自动执行此操作?
em.createNativeQuery("")
.getResultStream()
.map(o -> {
Object[] cols = (Object[]) o;
//Do some ugly error-prone mapping here and return a new DTO object
return new MyDto();
})
.filter(Objects::nonNull);
【问题讨论】:
标签: hibernate jpa projection entitymanager sql-view