【问题标题】:JPA query fails on empty listJPA 查询在空列表上失败
【发布时间】:2021-10-25 16:18:56
【问题描述】:

我有这个实体:

@Data
@Entity
public class MyEntity {
    @Id Long id;
    @ManyToMany List<Foo> foos;
    @ManyToMany List<Bar> bars;
}

我需要防止重叠,所以如果任何foos 包含一个带有id 1foo 和一个带有id 2bar,则不能有另一个MyEntity 包含相同的foos 和bars 组合。

所以我做了这个存储库:

public interface MyEntityRepository extends JpaRepository<MyEntity, Long>  {
    List<MyEntity> findAllByFoosInAndBarsIn(List<MyEntity> foo, List<MyEntity> bar);
}

只要两个列表都包含某些内容,它就可以正常工作。但如果由于某种原因其中一个为空,则结果集也是。

【问题讨论】:

  • 您是否尝试通过 null 代替?或者是...FoosInOrBarsInAnd 基本上意味着 foos in {...} and bars in {...} 并且由于 x in {} 永远不可能为真,如果 either 参数列表为真,则任何实体都不会匹配。
  • 查看生成的SQL语句

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


【解决方案1】:

你的逻辑不是默认的。因此,您需要为自定义查询提供所需的逻辑。下面应该使用命名参数来完成这项工作。

public interface MyEntityRepository extends JpaRepository<MyEntity, Long>  {
    
   @Query("select m from MyEntity m WHERE 
     ( (NOT(:foo IS EMPTY) AND m.foos IN :foo) OR :foo IS EMPTY ) AND
     ( (NOT(:bar IS EMPTY) AND m.bars IN :bar) OR :bar IS EMPTY ) 
     List<MyEntity> findAllByFoosInAndBarsIn(@Param("foo") List<MyEntity> foo, 
                                             @Param("bar") List<MyEntity> bar);
}

在提供的查询中,过滤 IN (...) 为提供的列表,仅当提供的列表不为空时才适用。如果它为空,则过滤器 IN (...) 将不会应用于 where 子句。

【讨论】:

  • 谢谢你,我会试试看的!
  • 这给了我一个org.hibernate.QueryException: expecting '=', found '('
  • @jared 我已经用这个更新了查询尝试
猜你喜欢
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2022-01-19
  • 2018-07-11
相关资源
最近更新 更多