【问题标题】:JPQL: why i can´t select a record by date?JPQL:为什么我不能按日期选择记录?
【发布时间】: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


【解决方案1】:

切勿使用字符串连接将参数传递给查询。使用参数:

String query = "SELECT o FROM EntityClient o " + 
                "WHERE o.birthDate = :birthDate";
List<EntityClient> list = 
    entityManager.createQuery(query, EntityClient.class)
                 .setParameter("birthDate", new DateTime("1966-07-21"))
                 .getResultList()

【讨论】:

  • 你是对的。我将代码更改为使用参数,现在它可以完美运行。从现在开始,我会记住参数。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2020-08-22
  • 2021-03-16
  • 2023-04-02
相关资源
最近更新 更多