是否可以使用逻辑运算符分组编写Spring Data JPA查询方法名称?

dly7yett  于 8个月前  发布在  Spring
关注(0)|答案(2)|浏览(60)

假设我有一个这样的实体类(为了简洁起见,代码最少):

@Entity
public class Thing {
    private Long groupID;
    private String name;
    private String description;
}

要求是实现对namedescription中存在的字符串值的搜索,以及对具有特定groupIDThing s的搜索。我会尝试编写一个Spring Data JPA“派生”的查询方法,如以下方法之一:

public ThingRepo extends JpaRepository<Thing, Long> {

    public Collection<Thing> findByGroupIDAndNameContainsOrDescriptionContains(Long groupID, String name, String description);

    public Collection<Thing> findByNameContainsOrDescriptionContainsAndGroupID(String name, String description, Long groupID);
}

要在namedescription中搜索相同的文本,我会为两个方法参数传递相同的值。然而,这两个都没有产生预期的结果,因为Spring Data如何处理方法名称中的逻辑AndOr运算符-我找不到任何方法将namedescription条件与逻辑Or分组。
有没有一种方法可以实现这样的查询方法,而不需要求助于JPQL和@Query

56lgkhnf

56lgkhnf1#

findByGroupIDAndNameContainsOrDescriptionContains(...)的计算结果为(A∧B)∨C,但如果我理解正确,您需要A∧(B∨C),它相当于(A∧B)∨(A∧C),因此应该是

public Collection<Thing> findByGroupIdAndNameContainsOrGroupIdAndDescriptionContains(Long groupId1, String name, Long groupId2, String description)

其中name=descriptiongroupId1=groupId2

ltqd579y

ltqd579y2#

优先顺序是And then Or,就像Java一样。您可能必须沿着namegroupiddescriptiongroupid这行做一些事情,这意味着名称和组ID匹配或描述和组ID匹配。
因此,您的方法可以命名为:

public ThingRepo extends JpaRepository<Thing, Long> {
    public Collection<Thing> 
       findByGroupIDAndNameContainsOrGroupIDAndDescriptionContains
           (Long groupId, String name, Long groupId2, String description);
}

相关问题