Leo*_*ado 13 java spring sqlresultsetmapping nativequery spring-data-jpa
我遇到了以下情况:
我的实体彼此相关,但是这样我就无法使用JPQL.我被迫使用原生SQL.现在我想将这些结果映射到ValueObject.要清楚,我不想得到Object array(List<Object[]>)的列表.我有6个实体,我只需要一些列.任何人都可以举例说明如何从本机查询实现这样的映射?
我经历过的教程.
我的代码:
@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
}
Run Code Online (Sandbox Code Playgroud)
在我的jpa-repository模块中:
public interface MyRepository extends JpaRepository<MyEntity, Long> {
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
Run Code Online (Sandbox Code Playgroud)
关键是我不知道在哪里放这些注释,所以我可以使用这种映射.在本机查询中我无法使用new rs.rado.leo.mypackage.MyVO(...).我收到以下错误:
引起:
org.springframework.data.mapping.PropertyReferenceException: No property findAllOfMyVO found for type MyEntity!
Run Code Online (Sandbox Code Playgroud)
我想我的问题很明确.如果没有,请告诉我,以便我可以编辑我的问题.
提前致谢!
小智 15
添加缺少的resultClass
@NamedNativeQuery(name = "findAllDataMapping", resultClass = Entity.class, query="sql")
Run Code Online (Sandbox Code Playgroud)
要么
@NamedNativeQuery(name = "findAllDataMapping", resultClass = MyVO.class, resultSetMapping ="findAllDataMapping" query = "sql")
Run Code Online (Sandbox Code Playgroud)
最后在您的存储库中调用查询
@Query(nativeQuery = true, name = "findAllDataMapping")
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
Run Code Online (Sandbox Code Playgroud)
你快到了,但对于下面的部分
@SqlResultSetMapping和@NamedNativeQuery必须存在于实体中,而不是值对象中。在您的情况下,它应该在 MyEntity 类中,而 ** 不是 ** MyVO 类。这应该可以解决您的异常。那还是不行。完成上述操作后,更改以下内容
@NamedNativeQuery(name = "findAllDataMapping", to
@NamedNativeQuery(name = " MyEntity .findAllDataMapping",
最后,在某些情况下,您需要明确定义@ColumnResult(name = "userFirstName")。如果它是像 ZonedDateTime 或 Boolean 这样的复杂字段,您可能必须明确声明 @ColumnResult(name = "date_created", type = ZonedDateTime.class)。
希望有帮助。
您需要将您的查询标记为查询:)并且您需要使用MyVO而不是MyEntity,因为这是您将结果映射到的实体
@Repository
public interface MyRepository extends JpaRepository<MyVO, Long> {
@Query(nativeQuery = true)
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10789 次 |
| 最近记录: |