Spring Data JPA:查询如何返回非实体对象或对象列表?

我在我的项目中使用弹簧数据JPA。我正在播放数百万张唱片。我有一个要求,我必须为各种表获取数据并构建一个对象,然后在UI上绘制它。现在如何实现这一点,我的春季数据存储库。我已经读到它可以通过命名的本机查询来实现。

如果命名的本机查询不返回实体或实体列表,我们可以使用@SqlResultSetMapping注释将查询结果映射到正确的返回类型。

但是当我试图使用它时,它正在采取另一个实体Result。我理解的意思是,它只是将一些查询结果转换为实体结果集,但我想要一个非实体对象的结果集。@SqlResultSetMapping

@SqlResultSetMapping(
    name="studentPercentile",
    entities={
        @EntityResult(
           entityClass=CustomStudent.class,
              fields={
                  @FieldResult(name="id", column="ID"),
                  @FieldResult(name="firstName", column="FIRST_NAME"),
                   @FieldResult(name="lastName", column="LAST_NAME")
              }         
        )
   }
) 
@NamedNativeQuery(
    name="findStudentPercentile", 
    query="SELECT * FROM STUDENT", 
    resultSetMapping="studentPercentile")

在上面的例子中,我只是试图将学生实体的结果放入另一个pojo'CustomStudent',这不是一个实体。(这个例子我试图执行只是为了POC目的,实际用例要复杂得多,复杂的查询返回不同的结果集)。

如何实现上述用例?除了使用名称查询之外,还有其他方法可以使我的存储库方法返回非实体对象吗?


答案 1

你可以做这样的事情

@NamedQuery(name="findWhatever", query="SELECT new path.to.dto.MyDto(e.id, e.otherProperty) FROM Student e WHERE e.id = ?1")

然后,MyDto对象只需要一个用正确字段定义的构造函数,即

public MyDto(String id, String otherProperty) { this.id = id; this.otherProperty = otherProperty; }

答案 2

当我第一次遇到这个问题时,我感到非常惊讶,但是,是的,您可以使用@SqlResultSetMapping将查询结果映射到标量和托管实体。

我想,你能做的最好的事情就是跳过自动映射。不带映射的查询将返回,您可以根据需要映射它。List<Object[]>

另一种方法是使用@MappedSuperclass。表示为@MappedSuperclass的类(在您的情况下为 CustomStudent)可以在@SqlResultSetMapping中使用(尽管不确定 100%)。但是您需要引入继承层次结构,即您的学生实体必须扩展CustomStudent。这将从正确的OO设计中吸取大部分时间,因为继承会有点人为......


推荐