I am trying to test a JPA repository. Here is my client/test code:
@Test public void testFindBoitesByMultiFieldWithIdentifiantSet() { BoiteDataOnDemand dod = new BoiteDataOnDemand(); Boite boite = dod.getSpecificBoite(0); boite.setIdentifiant("theIdentifiant"); boiteRepository.save(boite); assertEquals(10, Boite.countBoites()); BoiteQueryInfo boiteQueryInfo = new BoiteQueryInfo(); boiteQueryInfo.setIdentifiant("theIdentifiant"); List<Boite> boites = boiteRepository.findBoitesByMultiField(boiteQueryInfo, 1, 5, "identifiant", "desc"); assertEquals(1, boites.size()); } Here is the repository method:
@Override public List<Boite> findBoitesByMultiField(BoiteQueryInfo boiteQueryInfo, Integer firstResult_, Integer maxResults_, String sort_, String order_) { log.debug("findBoitesByMultiField"); final String identifiant = boiteQueryInfo.getIdentifiant(); final Date dateOuvertureFrom = boiteQueryInfo.getDateOuvertureFrom(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery<Boite> c = criteriaBuilder.createQuery(Boite.class); Root<Boite> boite = c.from(Boite.class); List<Predicate> criteria = new ArrayList<Predicate>(); ... if (identifiant != null && !identifiant.trim().equals("")) { ParameterExpression<String> parameter = criteriaBuilder.parameter(String.class, "identifiant"); Predicate condition = criteriaBuilder.like(boite.<String> get("identifiant"), parameter); criteria.add(condition); } if (dateOuvertureFrom != null && dateOuvertureTo != null) { ParameterExpression<Date> parameterDateOuvertureFrom = criteriaBuilder.parameter(Date.class, "dateOuvertureFrom"); ParameterExpression<Date> parameterDateOuvertureTo = criteriaBuilder.parameter(Date.class, "dateOuvertureTo"); Predicate condition = criteriaBuilder.between(boite.<Date> get("dateOuverture"), parameterDateOuvertureFrom, parameterDateOuvertureTo); criteria.add(condition); } else if (dateOuvertureFrom != null) { ParameterExpression<Date> parameter = criteriaBuilder.parameter(Date.class, "dateOuvertureFrom"); Predicate condition = criteriaBuilder.greaterThanOrEqualTo(boite.<Date> get("dateOuverture"), parameter); criteria.add(condition); } else if (dateOuvertureTo != null) { ParameterExpression<Date> parameter = criteriaBuilder.parameter(Date.class, "dateOuvertureTo"); Predicate condition = criteriaBuilder.lessThanOrEqualTo(boite.<Date> get("dateOuverture"), parameter); criteria.add(condition); } ... if (order.equalsIgnoreCase("desc")) { c.orderBy(criteriaBuilder.desc(boite.get(sort))); } else { c.orderBy(criteriaBuilder.asc(boite.get(sort))); } for (Predicate predicate : criteria) { c.where(criteriaBuilder.and(predicate)); } TypedQuery<Boite> q = em.createQuery(c); if (identifiant != null && !identifiant.trim().equals("")) { q.setParameter("identifiant", "%" + identifiant + "%"); } if (dateOuvertureFrom != null && dateOuvertureTo != null) { q.setParameter("dateOuvertureFrom", dateOuvertureFrom); q.setParameter("dateOuvertureTo", dateOuvertureTo); } else if (dateOuvertureFrom != null) { q.setParameter("dateOuvertureFrom", dateOuvertureFrom); } else if (dateOuvertureTo != null) { q.setParameter("dateOuvertureTo", dateOuvertureTo); } ... return q.setFirstResult(firstResult).setMaxResults(maxResults).getResultList(); } However, the test always fails at assertEquals(1, boites.size()); indicating that no result is returned i.e. (java.lang.AssertionError: expected:<1> but was:<0>).
I strongly suspect something is wrong here:
for (Predicate predicate : criteria) { c.where(criteriaBuilder.and(predicate)); } But I am not sure how to "and" the criteria.
Can anyone please provide advice?
P.S. FYI, BoiteDataOnDemand inserts random 10 rows into the boite table.
EDIT: code was edited to make it shorter.