条件 API:正确的日期格式
Criteria API: Correct Date Format
我正在制作一个能够根据某些条件过滤数据的搜索模块。
我已经做了以下:
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 此处不显示导入。
我有一个 JSF 页面,其中填写了出发日期和到达日期。
然后在 getPredicates 方法中检查 departmentDate 是否等于我们数据库中的 Dates。问题是他们有不同的格式,所以他从来没有找到任何东西。
我不倾向于使用 Criteria API,可能还有另一种方法,但您可以使用如下的 between 运算符:
private List<Predicate> getPredicates(CriteriaBuilder cb, Root<Flight> c,
Date departureDate) {
List<Predicate> predicates = new ArrayList<>();
//remove time portion from specified date: now dd/mm/yy 00:00
Date startDate = DateUtils.truncate(departureDate, Calendar.DATE);
//new date with time initialized to 23:59:59
Date endDate = DateUtils.addSeconds(DateUtils.addDays(startDate, 1), - 1);
predicates.add(cb.between(c.get(Flight_.departureDate), startDate, endDate));
return predicates;
}
DateUtils 是 Commons Lang 中的 class:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
我正在制作一个能够根据某些条件过滤数据的搜索模块。
我已经做了以下:
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 此处不显示导入。
我有一个 JSF 页面,其中填写了出发日期和到达日期。 然后在 getPredicates 方法中检查 departmentDate 是否等于我们数据库中的 Dates。问题是他们有不同的格式,所以他从来没有找到任何东西。
我不倾向于使用 Criteria API,可能还有另一种方法,但您可以使用如下的 between 运算符:
private List<Predicate> getPredicates(CriteriaBuilder cb, Root<Flight> c,
Date departureDate) {
List<Predicate> predicates = new ArrayList<>();
//remove time portion from specified date: now dd/mm/yy 00:00
Date startDate = DateUtils.truncate(departureDate, Calendar.DATE);
//new date with time initialized to 23:59:59
Date endDate = DateUtils.addSeconds(DateUtils.addDays(startDate, 1), - 1);
predicates.add(cb.between(c.get(Flight_.departureDate), startDate, endDate));
return predicates;
}
DateUtils 是 Commons Lang 中的 class:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>