spring data jpa原生查询中基于地图索引的查询

Posted

技术标签:

【中文标题】spring data jpa原生查询中基于地图索引的查询【英文标题】:Query based on map index in spring data jpa native query 【发布时间】:2021-11-22 13:14:34 【问题描述】:

我有两个实体 AAA 和 BBB 如下

class AAA

  @Id private String Id;

 @OneToMany(mappedBy = "aaa", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @MapKey(name = "bbbType")
  @Setter
  private Map<BBBType, BBB> bbbDetails;
  
  private String status;

和 BBB 实体一样

class BBB 
 @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "Id")
  @Setter
  private AAA aaa;

  private BBBType bbbType;  // BBBType is a enum of Strings

  private boolean flag;

现在使用 spring data JPA 原生查询我需要如下查询(使用 JPARepository)

@Query(
      "select a.Id from aaa a where 
           a.status = :status and a.bbbDetails['BBBType.FIRST'].flag= false")
  List<String> findAllIdsByTypeAndStatus(@Param("status") String status);

执行时出现以下异常

引起:org.springframework.beans.BeanInstantiationException: 无法实例化 [java.util.List]:工厂方法 'loadDataForPartitioner' 抛出异常;嵌套异常是 org.springframework.dao.InvalidDataAccessResourceUsageException:可以 不准备声明; SQL [/* select a.Id from AAA a where a.status = :status 和 a.bbbDetails['BBBType.FIRST'].flag= false */ 选择 aaa0_.id as col_0_0_ from aaa aaa0_ cross join bbb_details bbbde1_ 其中 aaa0_.id=bbbde1_.id 和 bbbde1_.null = 'BBBType.FIRST' 和 aaa0_.status=?和 bbbde1_.flag=false];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法准备 陈述 ... ……………… ;嵌套异常是 org.hibernate.exception.SQLGrammarException: 无法准备语句

这里的 bbbDetails 是键(BBBType)值(子实体)对的映射。如何根据data jpa原生查询中的BBBType值查询映射的子实体?

【问题讨论】:

【参考方案1】:

使用这样的查询:

select a.Id 
from aaa a 
join a.bbbDetails b on key(b) = BBBType.FIRST
where a.status = :status and b.flag = false

【讨论】:

以上是关于spring data jpa原生查询中基于地图索引的查询的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA原生SQL查询

Spring Data JPA 原生查询结果实体

Spring data JPA,复杂原生Query

Spring Data JPA 之 原生SQL使用

Spring Data JPA 将原生查询结果映射到非实体 POJO

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