如何使用条件构建器使用多个过滤器进行搜索

我想在Java中做一个多重过滤器,我使用Spring Boot。我的查询是使用条件写的。

SearchApp.java:

@Entity
@Table(name = "searchapp")
public class SearchApp implements Serializable {

@Column(name = "code")
private String code;
@Column(name = "release")
private String release;
@Column(name = "environnement")
private String environnement;
@Column(name = "date")
private Date date;
private static final long serialVersionUID = -1701849052760947052L;

public SearchApp() {
    super();
    // TODO Auto-generated constructor stub
}
public DeploiementApp(String code,String release,String environnement,Date date) {
    super();
    this.code = code.toLowerCase();
    this.release = release;
    this.environnement = environnement;
    this.date= date;    
}

我有一个搜索控制器,这是进入我的应用程序的大门

SearchController.java:

@Autowired
SearchService searchService;

@GetMapping("/filtersearch")
public List<SearchApp> filter(@RequestParam("code") String code,@RequestParam("release") String release,@RequestParam("environnement") String environnement,@RequestParam("date") String date) {

    return searchService.filter(code.toUpperCase(),release.toUpperCase(),environnement.toUpperCase(),date);
}

SearchService.java:

List<SearchApp> filter(String code,String date);

SearchServiceImpl.java:

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;

public SearchServiceImpl(EntityManager em) {
    super();
    this.em = em;
}

@Override
public List<SearchApp> filter(String code,String date) {


    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    format.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
    Date dateBD = new Date();
         dateBD = format.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    CriteriaBuilder criteriaBuilder = em.getcriteriaBuilder();
    //select
    CriteriaQuery<SearchApp> criteriaQuery = criteriaBuilder.createQuery(SearchApp.class);
    //from
    Root<SearchApp> itemRoot = criteriaQuery.from(SearchApp.class);
    // attribut

    List<Predicate> predicate = new ArrayList<Predicate>();

    if(  code != "" || code != null) {
        Predicate predicateCode = criteriaBuilder.equal(itemRoot.get("code"),code);
        predicate.add(predicateCode);
    }

    if(  release != "" || release != null) {
        Predicate predicateRelease = criteriaBuilder.equal(itemRoot.get("release"),release);
        predicate.add(predicateRelease);
    }

    if(  environnement != "" || environnement != null) {
        Predicate predicateEnvironnement = criteriaBuilder.equal(itemRoot.get("environnement"),environnement);
        predicate.add(predicateEnvironnement);
    }

    if(  dateBD != null ) {
        Predicate predicateDate = criteriaBuilder.equal(itemRoot.get("date"),date);
        predicate.add(predicateDate);
    }

    Predicate And = criteriaBuilder.and(predicate.toArray(new Predicate[predicate.size()]));

    //where
    criteriaQuery.where(And);
    List<SearchApp> result = em.createQuery(criteriaQuery).getResultList();

    return result;
}

它不起作用。

错误:org.hibernate.query.criteria.internal.predicate.ComparisonPredicate@41f4f353        org.hibernate.query.criteria.internal.predicate.ComparisonPredicate@77ef22f7 还有日期错误

yxj366 回答:如何使用条件构建器使用多个过滤器进行搜索

将值直接传递给服务层,就像使用toUpperCase()一样,如果值为null,则该值将中断,并在服务层检查为null后,在条件构建器中使用上层,例如,

"criteriaBuilder.equal(criteriaBuilder.upper(itemRoot.get("code"),code.toUpperCase());"

使用dateDB代替日期,并且字符串date应该解析为Date对象。希望它能解决您的问题。 @Column(名称=“日期”) 私人日期日期; 日期列应为数据库表中的日期。

本文链接:https://www.f2er.com/2867223.html

大家都在问