java 如何在JPQL查询中比较LocalDateTime值?

ldioqlga  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(123)

必须使用JPQL查询和可选条件选择数据集-将字段值(LocalDateTime类型)与用户指定的参数(也是LocalDateTime类型)进行比较。
首先我做了一个运行良好的代码:

return entityManager.createQuery(
    "SELECT new com.******.*******.*******.****.models.dto.SomeDto " +
    "(s.id, " +
    "s.userId) " +
    "s.persistDate) " +
    "FROM Some s WHERE s.userId = :userId 
    AND s.persistDate >= :userDateTime", SomeDTO.class)
    .setParameter("userId", userId)
    .setParameter("userDateTime", userDateTime)

这段代码可以工作,但有一个问题:此条件可能存在也可能不存在-取决于应用逻辑。因此,不需要使用. setParameter注入(针对此条件),而是根据逻辑形成字符串(可能为空),然后添加到请求中:
x一个一个一个一个x一个一个二个x
但问题是,无论我如何尝试格式化userDateString变量,我都会得到一个内部服务器错误。我甚至尝试只使用文本字符串而不是变量(尝试不同的格式):

String extraCondition = (userDateString.equals("false")) ? "" : 
    "AND s.persistDateTime >= 2023-01-27T23:30:50";

但结果也很糟糕-内部服务器错误。
我还尝试使用. isAfter方法代替"〉="操作符,但也无济于事。
如何将LocalDateTime值比较作为字符串注入到查询中?

58wvjzkj

58wvjzkj1#

即使日期字符串可能是必要的,也可能不是必要的,您仍然可以(并且应该!)使用参数注入,而不是格式化值。
基本上,您的代码应该如下所示:

String queryStr = ....;
if(someCondition) {
  queryStr += " AND s.persistDate >= :userDateTime";
}
Query q = em.createQuery(queryStr).setParameter("userId", userId);
if(someCondition) {
  q.setParameter("userDateTime", userDateTime);
}

相关问题