gpt4 book ai didi

java - 如何在 Spring boot Crud 存储库中编写条件自定义查询

转载 作者:行者123 更新时间:2023-12-02 09:34:31 25 4
gpt4 key购买 nike

我必须使用 Repository 从实体表中获取记录,该 Repository 基于 2 个字段有条件地扩展 CRUDRepository,如下所示。

有 3 个字段,例如 a、b 和 c。

SELECT from EntityClass e where e.a = :a AND

(e.b = :b and e.c = :c). If no record found, then it should try below one
(OR e.b = :b and e.c = null). If no record found, then it should try below one
(OR e.b = null and e.c = :c). If no record found, then it should try below one
(OR e.b = null and e.c = null).

肯定会有一条或多条记录符合 4 个条件中的任何一个。但我希望它有一条符合任何条件的记录,并且顺序从头到尾都很重要。

如何为此编写自定义查询?

@Query(" ")
EntityClass findEntityForAandBandC(@Param("a") String a, @Param("b") String b, @Param("c") String c);

我可以通过 Java 代码使用 if else 并编写单独的查询方法来完成此操作。但我想为上面写一个单一的查询方法。

最佳答案

您可以使用 JpaSpecificationExecutor<T>

EntityClassRepo

public class EntityClassRepo extends extends JpaRepository<Demo, Long>, 
JpaSpecificationExecutor<Demo> {
}

现在你可以使用这个方法了

List< T > findAll(@Nullable Specification<T> spec)

  • findAll() 接受 Specificaion类,因此定义一个可以动态提供条件的规范

我不确定您需要什么查询,但下面的内容会给您一个想法。

EntityClassSpecificaiton(新类)

public class EntityClassSpecification implements Specification<EntityClass> {

private EntityClassFilter entityFilter; // This holds the value A, B & C

// Constructor

@Override
public Predicate toPredicate(Root<Demo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
if(/* Condition */) {
return criteriaBuilder.equal(root.get("a"), entityFilter.getA());
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.equal(root.get("b"), entityFilter.getB()), criteriaBuilder.equal(root.get("c"), entityFilter.getC()));
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.equal(root.get("b"), entityFilter.getB()), criteriaBuilder.isNull(root.get("c")));
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.isNull(root.get("b")), criteriaBuilder.equal(root.get("c"), entityFilter.getC()));
} else {
return criteriaBuilder.and(criteriaBuilder.isNull(root.get("b")), criteriaBuilder.isNull(root.get("c")));
}
}
}

服务

public class EntityService {

@Autowire
private EntityClassRepo entityRepo;

public List<EntityClass> getEntityClass(String a, String b, String c) {
return entityRepo.findAll(new EntitySpecification(new EntityFilter(a, b, c)));
}
}

关于java - 如何在 Spring boot Crud 存储库中编写条件自定义查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57656474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com