问题描述
我遇到以下情况:
我的实体彼此相关,但是我无法使用JPQL.我被迫使用本机SQL.现在,我想将这些结果映射到ValueObject.需要明确的是,我不想获取对象数组(List<Object[]>
)的列表.我有6个实体,从中我只需要一些列.谁能给我一个例子,说明如何通过本机查询实现这种映射?
My entities are related to each other, but in such a way that i could not use JPQL. I was forced to use native SQL. Now I want to map these results to a ValueObject. To be clear, I don't want to get a list of Object array (List<Object[]>
). I have 6 entities from which I need only some columns. Can anybody give me an example on how to implement such a mapping from a native query?
我的代码:
@SqlResultSetMapping(
name = "findAllDataMapping",
classes = @ConstructorResult(
targetClass = MyVO.class,
columns = {
@ColumnResult(name = "userFirstName"),
@ColumnResult(name = "userLastName"),
@ColumnResult(name = "id"),
@ColumnResult(name = "packageName")
}
)
)
@NamedNativeQuery(name = "findAllDataMapping",
query = "SELECT " +
" u.first_name as userFirstName, " +
" u.last_name as userLastName, " +
" i.id as id, " +
" s.title as packageName, " +
"FROM " +
" invoice as i " +
"JOIN user as u on i.user_id=u.id " +
"LEFT JOIN subscription_package as s on i.subscription_package_id=s.id " +
"where u.param1=:param1 and i.param2=:param2" +
)
public class MyVO {
private String userFirstName;
private String userLastName;
private Long id;
private String packageName;
public MyVO (String userFName, String userLName,
Long id, String packageName) {
this.userFirstName = userFName;
this.userLastName = userLName;
this.id = id;
this.packageName = packageName;
}
// getters & setters
}
在我的jpa存储库模块中:
In my jpa-repository module:
public interface MyRepository extends JpaRepository<MyEntity, Long> {
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
重点是我不知道将这些注释放在何处,因此可以使用这种映射.在本机查询中,我不能使用new rs.rado.leo.mypackage.MyVO(...)
.我收到以下错误:
The point is that I don't know where to put these annotations so I can use this kind of mapping. In a native query I can't use new rs.rado.leo.mypackage.MyVO(...)
. I got following error:
原因:
org.springframework.data.mapping.PropertyReferenceException: No property findAllOfMyVO found for type MyEntity!
我想我的问题很清楚.如果没有,请告诉我,以便我可以编辑我的问题.
I suppose that my question is clear. If not, let me know so I can edit my question.
提前谢谢!
推荐答案
添加缺少的resultClass
Add the missing resultClass
@NamedNativeQuery(name = "findAllDataMapping", resultClass = Entity.class, query="sql")
或
@NamedNativeQuery(name = "findAllDataMapping", resultClass = MyVO.class, resultSetMapping ="findAllDataMapping" query = "sql")
最后在存储库中调用查询
and lastly call the query in your repository
@Query(nativeQuery = true, name = "findAllDataMapping")
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
这篇关于具有SqlResultSetMapping和本机查询的JPA数据存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!