Java 使用谓词查询数据并使用Spring数据JPA分页

Java 使用谓词查询数据并使用Spring数据JPA分页,java,spring,oracle,jpa,spring-data,Java,Spring,Oracle,Jpa,Spring Data,我不幸地在Java工作了一段时间,来自.net世界。撇开陈词滥调不谈,我只是想实现一个能够处理谓词使用并且必须具有分页的存储库。我找不到一个好办法来做这件事 // IContactRepository.java public interface IContactRepository extends Repository<Contact,Long> { } // Application.java contactRepo.findAll(predicate, new PageReque

我不幸地在Java工作了一段时间,来自.net世界。撇开陈词滥调不谈,我只是想实现一个能够处理谓词使用并且必须具有分页的存储库。我找不到一个好办法来做这件事

// IContactRepository.java
public interface IContactRepository extends Repository<Contact,Long> {

}
// Application.java
contactRepo.findAll(predicate, new PageRequest(0,10));
//IContactRepository.java
公共接口IContactRepository扩展存储库{
}
//Application.java
contactRepo.findAll(谓词,新页面请求(0,10));
我想能够找到联系人姓名包含搜索词或联系人电话号码包含搜索词,然后获得前10个匹配项


在.net世界中,如果我没有使用orm,我会使用sql server的出色TSQL来获得我想要的,但仍然坚持使用Oracle。否则,我将使用一些ORM并将lambda作为谓词传递给查询函数

我猜您正在查看
谓词
,因为您希望能够执行任意复杂的查询

但是没有
findAll(谓词,可分页)
方法。 我建议您查看
规范
JpaSpecificationExecutor
。您的代码如下所示:

public interface IContactRepository extends JpaRepository<Contact,Long>, JpaSpecificationExecutor<Contact> {

}
公共接口IContactRepository扩展了JpaRepository,JpaSpecificationExecutor{
}
然后您就可以访问方法
findAll(规范,可分页)
。根据您的需求,
规范
是一个功能接口,因此您可以使用lambda轻松地传入实现

有关更多详细信息,请查看中的章节
2.5

规范
的Javadoc,是
JpaSpecificationExecutor


此外,如果您不得不忍受Java带来的痛苦,您可能应该在
IContactRepository
:)中删除
I
。Java代码通常放弃.NET实践

在我的配置中,我也在使用JPA和spring。(对于静态谓词。如果要动态添加谓词(搜索词),请通知我。)

//IContactRepository.java
公共接口IContactRepository扩展了CRUDepository、Paging和SortingRepository{
列出FindByContactNameLike和ContactPhoneLike(字符串名称、字符串电话、可分页)
}
我试着用Crudepo进行Pageable,效果很好。 对于lambda,你是对的:)

在我的配置中,您的实现如下所示:

IContactRepository contactRepo = context.getBean(IContactRepository.class);
List<Contacts> results = contactRepo.findByContactNameLikeAndContactPhoneLike("%CA%","%090%" , new PageRequest(1, 20));
IContactRepository contactRepo=context.getBean(IContactRepository.class);
列表结果=contactRepo.findByContactNameLikeAndContactPhoneLike(“%CA%”,“%090%”,new PageRequest(1,20));


请查看查询创建下的1.2.2定义查询方法

这是我的实现,可能对您有所帮助:

@Override
public Page<Advert> findActiveAdverts(String searchValue, String availability, Long branchId, Long categoryId, Pageable pageable) {
    Page<Advert> adverts = advertRepository.findAll(new Specification<Advert>() {
        @Override
        public javax.persistence.criteria.Predicate toPredicate(Root<Advert> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();

            predicates.add(cb.equal(root.get(Advert_.ACTIVE), true));

            if (!StringUtils.isEmpty(searchValue)) {
                predicates.add(cb.or(
                        cb.like(root.get(Advert_.TITLE), "%" + searchValue + "%"),
                        cb.like(root.get(Advert_.EXPLANATION), "%" + searchValue + "%"))
                );
            }

            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        }
    }, pageable);
    return adverts;
}
@覆盖
公共页面findActiveAdverts(字符串搜索值、字符串可用性、长branchId、长类别ID、可分页){
PageAdverts=advertRepository.findAll(新规范(){
@凌驾
public javax.persistence.criteria.Predicate toPredicate(根根目录、CriteriaQuery查询、CriteriaBuilder cb){
列表谓词=新的ArrayList();
add(cb.equal(root.get(Advert.ACTIVE),true));
如果(!StringUtils.isEmpty(searchValue)){
谓词.add(cb.or(
cb.like(root.get(广告标题),“%”+searchValue+“%”,
cb.like(root.get(广告解释),“%”+searchValue+“%”)
);
}
返回cb.and(predicates.toArray(新谓词[predicates.size()]);
}
},可分页);
返回广告;
}

是否要动态添加谓词?现在谓词需要足够动态,以便我可以对联系人姓名或联系人号码进行类似查询,并返回分页结果。向下投票,因为我认为从C#迁移到Java是一种不幸??,org.springframework.data.domain.Pageable)是我找到我试图使用的findAll变体的地方。我不知道你在哪里查看QueryDSL变体!我的错!这对我来说是我想要做的。谢谢你对我的问题不加评判。
@Override
public Page<Advert> findActiveAdverts(String searchValue, String availability, Long branchId, Long categoryId, Pageable pageable) {
    Page<Advert> adverts = advertRepository.findAll(new Specification<Advert>() {
        @Override
        public javax.persistence.criteria.Predicate toPredicate(Root<Advert> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();

            predicates.add(cb.equal(root.get(Advert_.ACTIVE), true));

            if (!StringUtils.isEmpty(searchValue)) {
                predicates.add(cb.or(
                        cb.like(root.get(Advert_.TITLE), "%" + searchValue + "%"),
                        cb.like(root.get(Advert_.EXPLANATION), "%" + searchValue + "%"))
                );
            }

            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        }
    }, pageable);
    return adverts;
}