Reputation: 327
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
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