相关疑难解决方法(0)

Spring Data JPA将本机查询结果映射到非实体POJO

我有一个带有本机查询的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.

是否有可能,如果可以的话,请你提供一个例子吗?

spring hibernate jpa pojo spring-data

69
推荐指数
4
解决办法
9万
查看次数

将NativeQuery结果映射到POJO

我试图使用带@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)

java hibernate jpa pojo

34
推荐指数
5
解决办法
6万
查看次数

@NamedNativeQuery与@SqlResultSetMapping为非实体

我一直在用这篇文章作为例子.我有一个复杂的连接查询(这里简化).它从两个表(以及使用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)

java jpa named-query sqlresultsetmapping spring-data-jpa

8
推荐指数
1
解决办法
5794
查看次数