【问题标题】:JPA mapping native query result to non entity DTOJPA 将本机查询结果映射到非实体 DTO
【发布时间】:2019-07-25 13:24:06
【问题描述】:

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

我的 DTO 课程

@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();

}

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

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

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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 和命名查询的更多信息

    【讨论】:

    • 其实那是我的错,我的方法名称是 getItemDetails 但我必须添加 Item。名称开头的前缀。感谢您的回答。
    • 知道您为什么不使用 RowMapper 吗?
    • @Anil 也许是因为 SqlResultSetMapping 是 JPA 标准?
    猜你喜欢
    • 2020-06-01
    • 2015-05-18
    • 2021-08-13
    • 2014-06-25
    • 1970-01-01
    • 2022-01-11
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多