static
static

Reputation: 327

How to search with multiple filter using criteria builder

I would like to make a multiple filter in java, I use Spring Boot. And my query are written using criteria.

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;    
}

I have a search controller, which is the door to enter my application

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 environnement, String release, 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 release, String environnement, 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;
}

It does not work.

error: org.hibernate.query.criteria.internal.predicate.ComparisonPredicate@41f4f353 org.hibernate.query.criteria.internal.predicate.ComparisonPredicate@77ef22f7 also date errors

Upvotes: 4

Views: 5877

Answers (1)

Vivek
Vivek

Reputation: 436

Pass the values directly to service layer as you are using toUpperCase() which will break if values are null and after checking null at service layer, use upper in criteria builder like,

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

Use dateDB instead of date and string date should be parsed to Date object. Hopefully it will resolve your issue. @Column(name = "date") private Date date; date column should be Date in database table.

Upvotes: 3

Related Questions