我有一个实体有~70个变量。我想做一些自定义查询搜索过滤,使用不同的组合,而不必创建10 000个查找方法,然后应用一些逻辑来选择正确的一个使用。
@PersistenceContext
EntityManager entityManager;
private CriteriaBuilder criteriaBuilder;
public PageImpl<TClaimModel> findAllWithFilters(TClaimModelSearchCriteria filters){
if (criteriaBuilder == null) criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<TClaimModel> criteriaQuery = criteriaBuilder.createQuery(TClaimModel.class);
Root<TClaimModel> claimRoot = criteriaQuery.from(TClaimModel.class);
Predicate predicate = getPredicate(filters, claimRoot);
criteriaQuery.where(predicate);
if(filters.getSortDirection().equals(Sort.Direction.ASC))
criteriaQuery.orderBy(criteriaBuilder.asc(claimRoot.get(filters.getSort())));
else
criteriaQuery.orderBy(criteriaBuilder.desc(claimRoot.get(filters.getSort())));
TypedQuery<TClaimModel> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult(filters.getPage() * filters.getPageSize());
typedQuery.setMaxResults(filters.getPageSize());
long claimsCount = getClaimsCount(predicate);
return new PageImpl<>(typedQuery.getResultList(), filters.getPageable(), claimsCount);
}
private Predicate getPredicate(TClaimModelSearchCriteria filters, Root<TClaimModel> claimRoot) {
List<Predicate> predicates = new ArrayList<>();
if (Objects.nonNull(filters.getClaimNum()))
predicates.add(criteriaBuilder.like(claimRoot.get("claimNum"), "%" + filters.getClaimNum() + "%"));
if (Objects.nonNull(filters.getClaimDate()))
predicates.add(criteriaBuilder.equal(claimRoot.get("claimDate"), filters.getClaimDate()));
if (Objects.nonNull(filters.getStartSearchDate())) {
if (Objects.nonNull(filters.getEndSearchDate()))
predicates.add(criteriaBuilder.between(claimRoot.get("claimDate"), filters.getStartSearchDate(), filters.getEndSearchDate()));
else
predicates.add(criteriaBuilder.greaterThanOrEqualTo(claimRoot.get("claimDate"), filters.getStartSearchDate()));
} else if (Objects.nonNull(filters.getEndSearchDate()))
predicates.add(criteriaBuilder.lessThanOrEqualTo(claimRoot.get("claimDate"), filters.getEndSearchDate()));
// repeat for each possible filter;
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
}
private long getClaimsCount(Predicate predicate) {
CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
Root<TClaimModel> countRoot = countQuery.from(TClaimModel.class);
countQuery.select(criteriaBuilder.count(countRoot)).where(predicate);
return entityManager.createQuery(countQuery).getSingleResult();
}
到目前为止,这是我的过滤代码,但是我得到一个错误“不是实体:在阅读到这个错误后,我发现我不能使用@PersistenceContext来获取实体管理器。那么,我该如何获取实体管理器呢?我可以自动连接一个实体管理器工厂,但它没有createQuery方法。
编辑:这个项目使用了2个数据库。在EntityManager上使用@Autowire也不起作用,因为我得到:
com.activiti.repository.alfresco.TClaimCriteriaRepository中的字段实体管理器需要一个bean,但找到了2个:共享实体管理器创建者#0:由null中的方法“创建共享实体管理器”定义- org.springframework.orm.jpa.SharedEntityManagerCreator#1:由方法“createSharedEntityManager”定义,为空
1条答案
按热度按时间yruzcnhs1#
作为一种解决方法,我手动构建了请求...
但我还是想知道正确的方法:P