我有一个带有本机查询的Spring Data存储库方法
@Query(value = "SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", nativeQuery = true)
GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId);
Run Code Online (Sandbox Code Playgroud)
我想将结果映射到非实体POJO GroupDetails.
是否有可能,如果可以的话,请你提供一个例子吗?
我试图使用带@ConstructorResult的@SqlResultSetMapping将Native查询的结果映射到POJO.这是我的代码:
@SqlResultSetMapping(name="foo",
classes = {
@ConstructorResult(
targetClass = Bar.class,
columns = {
@ColumnResult(name = "barId", type = Long.class),
@ColumnResult(name = "barName", type = String.class),
@ColumnResult(name = "barTotal", type = Long.class)
})
})
public class Bar {
private Long barId;
private String barName;
private Long barTotal;
...
Run Code Online (Sandbox Code Playgroud)
然后在我的DAO中:
Query query = em.createNativeQueryBar(QUERY, "foo");
... set some parameters ...
List<Bar> list = (List<Bar>) query.getResultList();
Run Code Online (Sandbox Code Playgroud)
我已经读过这个功能仅在JPA 2.1中受支持,但这正是我正在使用的.这是我的依赖:
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我发现了一些资源,包括这一个:jpa 2.1中的@ConstructorResult映射.但我仍然没有运气.
我错过了什么?为什么不能找到SqlResultSetMapping?
javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [foo]
Run Code Online (Sandbox Code Playgroud) 我一直在用这篇文章作为例子.我有一个复杂的连接查询(这里简化).它从两个表(以及使用CASE的派生列)返回值的子集.我认为我不需要使用实体注释,因为从我的结果集返回的对象不是我的架构中的实际表.
我想要保存的非实体对象来自我的连接查询:
@SqlResultSetMapping(
name="myMapping",
classes={
@ConstructorResult(
targetClass=CarLimitDelta.class,
columns={
@ColumnResult(name="caseCol"),
@ColumnResult(name="colA"),
@ColumnResult(name="colB"),
}
)
}
)
@NamedNativeQuery(name="CarLimitDelta.getCarLimitDelta",
resultSetMapping="myMapping",
query="SELECT CASE "+
"WHEN t.foo IS NULL THEN 'INS' "+
"WHEN s.foo IS NULL THEN 'DEL' "+
"ELSE 'UPD' "+
"END caseCol "+
", T.bar colA "+
", S.bar ColB "+
"FROM tableA S "+
"FULL JOIN TableB ON S.bar= T.bar")
public class CarLimitDelta {
private String caseCol;
private String colA;
private String colB;
//getters/setters/etc
}
Run Code Online (Sandbox Code Playgroud)
我的回购:
@Repository
public interface CarLimitRepository …Run Code Online (Sandbox Code Playgroud)