【发布时间】:2014-10-08 04:24:47
【问题描述】:
我正在使用 JPA 2.1、eclipseLink 和 SQLite3 数据库制作应用程序。
我有一个客户表,我在其中以毫秒为单位保存客户的生日。
在实体客户端中,我使用转换器将生日值从 DateTime (JodaTime) 转换为 Long:
@Converter
public class DateTimeConverter implements AttributeConverter<DateTime, Long> {
@Override
public Long convertToDatabaseColumn(DateTime arg0) {
return arg0 == null ? null : ((DateTime) arg0).getMillis();
}
@Override
public DateTime convertToEntityAttribute(Long arg0) {
return arg0 == null ? null : new DateTime(arg0);
}
}
我试图在 JPQL 中通过birthDate 获得其中一位客户,但我不知道该怎么做。我尝试了几件事,但没有一个能正常工作。例如,我尝试这样做:
EntityClient client = new EntityClient();
client.setBirthDate(new DateTime("1966-07-21"));
ArrayList<EntityClient> clientsByBirthdate = new ArrayList<>();
String query = "SELECT o FROM " + EntityClient.class.getCanonicalName() + " o " +
"WHERE o.birthDate = " + client.getBirthDate().getMillis();
for(Object obj : entityManager.createQuery(query).getResultList())
clientsByBirthdate.add(EntityClient.class.cast(obj));
但不是检索正确的记录,而是检索所有生日设置为空的记录。
我做错了什么?
【问题讨论】:
-
来自Joda :“首先,它将日期时间保存为从Java epoch 1970-01-01T00:00:00Z 开始的毫秒数” --> 这可能是原因吗? (你要的是 1966 年)
-
我不这么认为。在 Joda Time 中,1970 年之前的日期以负长表示。例如,
1966-07-21是-108867600000。我已经处理了 1970 年之前的日期,将它们保存在数据库中没有任何问题。但我非常绝望,我会尝试在 1970 年之后约会。 -
您的实体中的
birthDate是什么 - DateTime 还是 Long? -
好吧,我用晚于 1970 年的日期对其进行测试并引发异常。因此,当我使用 1970 年之前的日期时,我检索到不正确的记录,而当我使用 1970 年之后的日期时,它会引发 PersistanceException。我的实体中的
birthDate字段是DateTime
标签: java jpa sqlite jodatime jpql