java JPQL基于非空dto值进行选择

weylhg0b  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(135)

大家好,我正在使用springJPA,并且尝试基于非空的DTO字段值来过滤查询结果。
原因是每次我有不同的DTO字段时,我都应该只基于现有字段(换句话说,非空字段)获取帐簿。
我的DB表是books,并且我为它设置了以下DTO

public class BookDTO {
private String name;
private String title;
private String isbn;
private String author;
private int pages;
private String size;
}

我在网上搜索了一下,但是我没有找到一个解决这类问题的方法,无论如何都不能用SpringJPQL来实现

w1jd8yoj

w1jd8yoj1#

您可以使用Jpa规范执行器(scroll down to section 5)执行此操作
这样,您就可以通过编程方式定义要添加到where子句中的字段,如下所示。

(Specification<Book>) (book, cq, cb) ->
  cb.and(
    // You can dynamically construct that array of predicates based on which fields are set in the form
    cb.like(book.get("author"), "%" + author + "%"),
    cb.like(book.get("title"), "%" + title + "%")
  )
yrdbyhpb

yrdbyhpb2#

一个替代方案是使用SpringDataJPA规范。
您可以使用它为现有字段创建条件搜索。

public Predicate toPredicate
      (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
 
        if (criteria.getOperation().equalsIgnoreCase(">")) {
            return builder.greaterThanOrEqualTo(
              root.<String> get(criteria.getKey()), criteria.getValue().toString());
        } 
        else if (criteria.getOperation().equalsIgnoreCase("<")) {
            return builder.lessThanOrEqualTo(
              root.<String> get(criteria.getKey()), criteria.getValue().toString());
        } 
        else if (criteria.getOperation().equalsIgnoreCase(":")) {
            if (root.get(criteria.getKey()).getJavaType() == String.class) {
                return builder.like(
                  root.<String>get(criteria.getKey()), "%" + criteria.getValue() + "%");
            } else {
                return builder.equal(root.get(criteria.getKey()), criteria.getValue());
            }
        }
        return null;
    }

参考:https://www.baeldung.com/rest-api-search-language-spring-data-specifications

ecbunoof

ecbunoof3#

您可以尝试示例查询。
https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch17.html#querycriteria-examples
示例查询类org. hib. criterion. example允许您从给定示例构造查询条件。

Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .list();

忽略版本属性、标识符和关联。默认情况下,排除空值属性。
您可以调整应用示例的方式。

Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();

您甚至可以使用示例将条件放置在关联对象上。

List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .createCriteria("mate")
        .add( Example.create( cat.getMate() ) )
    .list();

相关问题