JPA 将原生查询结果映射到非实体 DTO

Tar*_*tar 6 java jpa sqlresultsetmapping spring-data-jpa spring-boot

我有一个复杂的本机查询,我正在尝试将其结果映射到非实体 DTO 类。我正在尝试使用JPA's SqlResultSetMappingwithConstructorResult

我的 DTO 课

@Data
public class Dto {

    private Long id;

    private String serial;

    private Long entry;

    private int numOfTasks;
}
Run Code Online (Sandbox Code Playgroud)

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

@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 {}
Run Code Online (Sandbox Code Playgroud)

存储库

@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {

    ...     

    List<Dto> getItemDetails();

}
Run Code Online (Sandbox Code Playgroud)

当我调用getItemDetails()from 时ItemRepository,出现以下错误:

org.springframework.data.mapping.PropertyReferenceException:找不到类型 Item 的属性 itemDetails

什么是使用正确的方式SqlResultSetMappingConstructorResult 解决这个问题。

任何帮助,将不胜感激。

Sim*_*lli 5

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

@NamedNativeQuery(name = "Item.getItemDetails", 
                 query = "complex query is here", resultSetMapping = "itemDetailsMapping")
Run Code Online (Sandbox Code Playgroud)

那么接口方法必须与没有前缀的命名查询同名:

List<Dto> getItemDetails();
Run Code Online (Sandbox Code Playgroud)

——

在参考文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries 中阅读有关 Spring Data JPA 和命名查询的更多信息