如何使用JPA忽略MySQL中給定DateTime字段的時間部分,從MySQL數據庫中過濾行?從基於DateTime列的MySQL中獲取記錄忽略使用JPA和Joda-Time的時間部分
例如,以下代碼段計算數據庫表中位於MySQL中DateTime
類型列中給出的兩個日期之間的行數。
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Long>criteriaQuery=criteriaBuilder.createQuery(Long.class);
Root<Discount> root = criteriaQuery.from(entityManager.getMetamodel().entity(Discount.class));
criteriaQuery.select(criteriaBuilder.countDistinct(root));
DateTimeFormatter dateTimeFormatter=DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa");
DateTime firstDate = dateTimeFormatter.parseDateTime("01-Oct-2013 11:34:26 AM").withZone(DateTimeZone.UTC);
DateTime secondDate = dateTimeFormatter.parseDateTime("31-Oct-2013 09:22:23 PM").withZone(DateTimeZone.UTC);
criteriaQuery.where(criteriaBuilder.between(root.get(Discount_.discountStartDate), firstDate, secondDate));
Long rowCount = entityManager.createQuery(criteriaQuery).getSingleResult();
的兩個參數firstDate
和secondDate
將反過來動態。
如何重寫此查詢,以便比較不包括要委派給MySQL的SQL查詢中的時間部分。
實體Discount
中的列discount_start_date
被指定如下。
@Column(name = "discount_start_date")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime discountStartDate;
是否真的需要委託給MySQL?如果不是,你可以在'DateTime.withMillisOfDay(0)'和'DateTime.withMillisOfDay(0).plusDays(1).plusMillis(-1)' – samlewis
@samlewis之間使用,比['withMillisOfDay'](http:// joda -time.sourceforge.net/apidocs/org/joda/time/DateTime。html#withMillisOfDay(int))會[[withTimeAtStartOfDay]](http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay())。不是每個時區都有午夜,所以最好避免以午夜爲導向的數學。 「withTimeAtStartOfDay」已添加到[Joda-Time](http://www.joda.org/joda-time/)以處理夏令時或其他可能會改變日期的問題。 –
'withMillisOfDay(0)'和'withTimeAtStartOfDay()'都會生成'[2013-10-02 05:30.90.0,2013-11-01 05:29:59.999]''的日期。其實,時間部分應該完全避免。這可能嗎?它應該對應於這個MySQL查詢 - ''選擇count(*)作爲cnt從折扣'2013-10-02'和'2013-11-01'之間的日期(discount_start_date)。 – Tiny