Spring Data JPA动态查询(多条件and)

entity:

@Entity
@Table(name = "data_illustration")
public class Test {

    @Id
    @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
    @GeneratedValue(generator = "uuid")
    private String id;

    @Column(name = "fileId")
    private String fileid;

    private String title;

    @Column(name = "WFState")
    private String wfstate;

    @Column(name = "issueNo")
    private String issueno;

    private String format;

    //对应得set、get方法省略

}

mapper:

public interface IllustrationMapper extends JpaRepository<Test, String> {
    @Transactional
    @Modifying
    @Query(value="delete from test where id=?1 ",nativeQuery=true)
    int deleteByPrimaryKey(String id);

    List<Test> findAll(Specification<CsdbDataIllustration> specification);   //传入Specification对象

}

service:

public List<Test > getDataIllustrationList(Test test) {
        List<Test > test2 = dataIllustrationMapper.findAll(new Specification<Test >(){
            @Override
            public Predicate toPredicate(Root<Test > root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<Predicate>();

                if(StringUtils.isNotBlank(test.getId())){
                    predicates.add(cb.equal(root.get("id"), test.getId()));
                }

                if(StringUtils.isNotBlank(test.getFileid())){
                    predicates.add(cb.equal(root.get("fileid"), test.getFileid() ));
                }
                if(StringUtils.isNotBlank(test.getTitle())){
                    predicates.add(cb.equal(root.get("title"), test.getTitle() ));
                }
                if(StringUtils.isNotBlank(test.getWfstate())){
                    predicates.add(cb.equal(root.get("wfstate"), test.getWfstate() ));
                }
                if(StringUtils.isNotBlank(test.getIssueno())){
                    predicates.add(cb.equal(root.get("issueno"), test.getIssueno() ));
                }
                if(StringUtils.isNotBlank(test.getFormat())){
                    predicates.add(cb.equal(root.get("format"), test.getFormat() ));
                }

                return cb.and(predicates.toArray(new Predicate[predicates.size()]));  //将上面满足条件的项用and拼接起
                                                   //来进行查询,当然此处也可以改为or或者like等等,视情况而定
            }

        });
        return test2;
    }
时间: 2024-10-10 10:58:48

Spring Data JPA动态查询(多条件and)的相关文章

【Spring Data 系列学习】Spring Data JPA 基础查询

[Spring Data 系列学习]Spring Data JPA 基础查询 前面的章节简单讲解了 了解 Spring Data JPA . Jpa 和 Hibernate,本章节开始通过案例上手 Spring boot Jpa . spring data Spring Data 库的核心接口是 Repository.首先需要定义实体类的接口,接口必须继承 repository 并且输入实体类型和 ID 类型,如果需要用到 CRUD 方法,可以使用 CrudRepository 来替代 Repo

【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application.properties与 Chapter1 相同 实体类映射数据库表 user 实体类 @Entity public class User implements Serializable { private static final long serialVersionUID = -39076354

Spring Data JPA 动态拼接条件的通用设计模式

import java.sql.Timestamp;import java.util.ArrayList;import java.util.List;import javax.persistence.criteria.CriteriaBuilder;import javax.persistence.criteria.CriteriaQuery;import javax.persistence.criteria.Predicate;import javax.persistence.criteria

Spring Data JPA 简单查询

一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  GreaterThan 大于8  GreaterThanEqual  大于等于9  After 之后(时间) >10 Before 之前(时间) <11 IsNull 等于Null12 IsNotNull,NotNull 不等于Null13 Like 模糊查询.查询件中需要自己加 %14 NotLike

Spring Data Jpa 复杂查询总结 (多表关联 以及 自定义分页 )

实体类 @Entity @Table(name = "t_hotel") @Data public class THotel { @Id private int id; private String name; private String address; /** * 城市id */ private String city; } @Entity @Table(name = "t_city") @Data public class TCity { @Id priva

Spring Data JPA 实例查询

一.相关接口方法 在继承JpaRepository接口后,自动拥有了按"实例"进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaRepository,如下所示: public interface QueryByExampleExecutor<T> { <S extends T> S findOne(Example<S> example); //根据"实例"查找一个对象.

spring data jpa 分页查询

法一(本地sql查询,注意表名啥的都用数据库中的名称) public interface UserRepository extends JpaRepository<User, Long> { @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1", countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", nativeQuery

Spring data jpa模糊查询,根据某一个字段,或者多个字段进行模糊查询

这里分别列举里三种情况: 1.一个字段的模糊查询 2.一个字段模糊查询和一个字段不支持模糊查询 3.两个以上的字段支持模糊查询 刚开始,使用like发现并不起作用,后来经同事帮忙,才改成的Containing关键字:     public List<Nodes> findByIpContaining(String ip, Pageable pageable);     public List<Nodes> findByIpContainingAndStatus(String ip,

Spring data jpa Specification查询关于日期的范围搜索

代码: 时间格式化类型: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdfmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { pr