【发布时间】:2018-11-13 14:19:29
【问题描述】:
我正在制作一个能够根据某些标准过滤数据的搜索模块。
我已经做了以下:
public class SearchModuleBean implements Serializable{
@PersistenceContext
EntityManager entityManager;
private Date departureDate;
private Date returnDate;
public List<Flight> search(){
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Flight> criteriaQuery = cb.createQuery(Flight.class);
Root<Flight> c = criteriaQuery.from(Flight.class);
criteriaQuery.select(c).where(getPredicates(cb, c).toArray(new Predicate[0]));
TypedQuery<Flight> query = entityManager.createQuery(criteriaQuery);
System.out.println(query.getResultList());
return query.getResultList();
}
private List<Predicate> getPredicates(CriteriaBuilder cb, Root<Flight> c) {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(c.get(Flight_.departureDate), departureDate));
return predicates;
}
}
这里不显示Getters/Setters/Annotations 和imports。
我有一个 JSF 页面,其中填写了出发日期和到达日期。 然后,在 getPredicates 方法中,我检查离开日期是否等于我们数据库中的日期。问题是它们的格式不同,所以他什么也找不到。
【问题讨论】:
-
Criteria 中的日期不是任何“格式”,它是一个 Java 日期对象。如果您有一个条件查询,但第一步有问题,请查看生成的 SQL 以及数据存储中的列类型
-
Billy Frost 是正确的,要检查的一件事是 Java 和数据库中的日期是否真的相等。 java.util.Date 可以包含时间信息,如果您的数据库仅包含日期信息,则它们可能不匹配(11-13-2018 12:00:00 != 11-13-2018 00:00:00)。
-
这是正确的,我知道,问题是它们确实不匹配,因为时间。即使我的数据库中有日期和时间,我也只能检查日期吗?
标签: java jpa criteria-api