当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA-如何使用投影和/或命名查询返回嵌套映射的id?

柏高洁
2023-03-14

我有这些实体-项目

 @Entity
 @Table(name="Item")
 public class Item 
 {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="item_set_id")
    private ItemSet itemSet;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="category_id")
    private Category category;

    @Column(name="category_name")
    private String categoryName;
    
    // 5 other fields which aren't required for the query
 }

类别-

@Entity
@Table(name="Category")
public class Category
{
    @Id
    @Column(name="id")
    private Long id;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="parent_id")
    private Category parent_id;
    
    @Column(name="name")    
    private String name;
}

我需要运行此sql查询:

select id, category_id, category_name from Item where item_set_id = ?

我在ItemRepository中使用了这个[1],但性能不好。它正在检索项目和类别中的所有字段(包括我不需要的与类别的联接)。

[1]

@Query("SELECT i FROM Item i WHERE item_set_id = ?1")
List<Item> findByItemSet(Long itemSetId);

我正在尝试使用命名查询和投影来提高性能,但我似乎一事无成。我一直遇到-<代码>验证失败,无法查询方法公共抽象java。util。列出findByItemSet(长)。我尝试创建一个DTO类和一个接口来做同样的事情,但仍然不起作用。

@Query("SELECT a.id, "
            + "a.category_name, a.category_id FROM Item a WHERE a.item_set_id = :itemSetId")
    List<Item> findByItemSet(Long itemSetId);

关于如何解决这个问题有什么想法/建议吗?

编辑:我正在使用springboot 2.0.4-RELEASE、java 8和MS-SQL Server 2012。

共有1个答案

东方吕恭
2023-03-14

您在HQL查询中错误地使用了列名,而您应该使用属性名。

您可以访问关联的属性,这就是JPA/Hibernate的优势。使用

@Query("SELECT a.id, a.categoryName, a.category.id FROM Item a WHERE a.itemSet.id = :itemSetId")
List<Tuple> findByItemSet(Long itemSetId);

如果需要实体对象,还可以使用以下

@Query("FROM Item a LEFT JOIN FETCH a.category WHERE a.itemSet.id = :itemSetId")
List<Item> findByItemSet(Long itemSetId);

如果要使用自定义数据来使用:

@Query("SELECT new com.dto.ItemDTO(a.id, a.categoryName, a.category.id) FROM Item a WHERE a.itemSet.id = :itemSetId")
List<ItemDTO> findByItemSet(@Param("itemSetId") Long itemSetId);
 类似资料:
  • 我有两个表,用户和角色,它们是多对多的 我正在使用EntityManager进行查询。 我如何使JPA知道映射一个用户和多个角色?

  • 我是Spring Data投影的新手,我正在尝试在一个新项目中使用此功能。 特别是,我想在与复杂查询关联的回购方法上使用投影。 我用注释注释了我的方法,并声明了一个JPA查询,其中包含几个连接的表/实体和一个复杂的where条件。 在本文中,我了解到可以使用基于接口的投影和基于类的投影,但只有第一个支持嵌套投影。 我需要嵌套投影,但似乎只有使用基于接口的投影才支持此功能,并且这种方法仅适用于自动生

  • 问题内容: 在我的DAO层中,我有一个类似的Find函数 因此,为了读取数据,我必须使用Loop(带有) 我的问题是:是否有任何api框架可以轻松地将其转换为对象列表(例如DQCategoryDTO),而无需使用任何循环,迭代器和调用setter / getter来填充值? 问题答案: 您可以使用ResultTransformer,它可以从别名转换为bean(DTO)属性。对于用法,您可以在此处的

  • 我使用spring jpa规范动态构建实体查询。 它工作完美,但是查询返回所有实体字段,这使得性能变慢。我只想获取特定的实体字段,而不是获取我不想要也不会使用的所有实体字段和依赖项。 我在网上搜索,尝试了一些场景,但没有任何不足。有人能就此提出任何解决方案吗? 提前感谢 这是我的。我正在使用spring boot 2.2.4 规格: 存储库: 音乐会服务: ConcertServiceImpl:

  • 我有一个奇怪的问题,我不知道为什么会发生。我肯定我做错了什么,因为这是我第一次使用数据投影,而且我在使用DTOS时从来没有遇到过这样的问题。 我有一个SELECT statemen,它返回各种数据类型的某些列。我有一个接口,我将它传递给JPA存储库,这样它就可以进行接口映射。但是它不是根据列名映射结果(例如'accountnum'->),而是按照字母顺序映射列。因此,如果'date_of_orde

  • 我不能同时使用Spring Data,JPA投影和规范。我有以下设置: 实体: 投影界面: 国家规格: 存储库: 前两个方法findByName和findAllProjectedBy工作良好。而第三个方法findAllProjectedBy(Specification Specification)抛出以下异常- 如何才能做到这一点呢?有什么想法吗?