JPA将本机查询结果映射到非实体DTO

时间:2019-03-04 08:57:20

标签: java spring-boot jpa spring-data-jpa sqlresultsetmapping

我有一个复杂的本地查询,我试图将其结果映射到非实体DTO类。我试图将JPA的{​​{1}}与SqlResultSetMapping一起使用

我的DTO课程

ConstructorResult

我的实体类,它具有存储库接口,我将其称为本机查询结果。

@Data
public class Dto {

    private Long id;

    private String serial;

    private Long entry;

    private int numOfTasks;
}

存储库

@SqlResultSetMapping(
        name = "itemDetailsMapping",
        classes = {
                @ConstructorResult(
                        targetClass = Dto.class,
                        columns = {
                                @ColumnResult(name = "ID"),
                                @ColumnResult(name = "SERIAL"),
                                @ColumnResult(name = "ENTRY"),
                                @ColumnResult(name = "TASKS")
                        }
                )
        }
)

@NamedNativeQuery(name = "getItemDetails", query = "complex query is here", resultSetMapping = "itemDetailsMapping")
@Entity
@Data
public class Item {}

当我从@Repository public interface ItemRepository extends JpaRepository<Item, Long> { ... List<Dto> getItemDetails(); } 呼叫getItemDetails()时,出现以下错误:

  

org.springframework.data.mapping.PropertyReferenceException:否   属性itemItem类型的详细信息

使用ItemRepositorySqlResultSetMapping的正确方法是什么 解决这个问题

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

要使用命名查询,命名查询的名称必须以实体名称作为前缀:

@NamedNativeQuery(name = "Item.getItemDetails", 
                 query = "complex query is here", resultSetMapping = "itemDetailsMapping")

然后,接口方法必须与不带前缀的命名查询具有相同的名称:

List<Dto> getItemDetails();

-

在参考文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries

中了解有关Spring Data JPA和命名查询的更多信息。