当前位置: 首页 > 知识库问答 >
问题:

使用JPA2.1为日期字段使用Like表达式

李明贤
2023-03-14

我试图使用如下所示的命名查询对日期字段执行类似表达式的查询;

public Users getResultsByDate(Date regDate){
 List<Users> dbUsers = new ArrayList<Users>();
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 Query searchQuery = getEntityManager().createNamedQuery("getUserByRegDate");
       searchQuery.setParameter("regDate", "%"+dateFormat.format(regDate)+"%");
try{
         dbUsers = searchQuery.getResultList();
     }
 catch(Exception ex){
         dbUsers = new ArrayList<Users>();
     }
 return dbUsers;

}

对应类中的名称查询为;

 @NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE user.regDate LIKE :regDate"),

查询使用以前的JPA 2.0版本。当我在JPA 2.1上运行时,我得到以下错误;

您试图设置java类类型的值。参数:regDate的lang.String,预期类型为java类。util。日期

在JPA2.1上运行时,如何解决这个问题?它在JPA2.0中运行正常。

共有3个答案

澹台华翰
2023-03-14

关键是使用DB函数“to_CHAR”(ORACLE)或MySQL函数“date_format”,然后在@NamedQuery中使用用户函数,如下所示;

甲骨文数据库

@NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE FUNCTION('TO_CHAR',user.reg_date,'yyyy-MM-dd') LIKE :regDate") 

MySQL

将上面的“TO_CHAR”更改为“date_format”

@NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE FUNCTION('date_format',user.reg_date,'%Y-%m-%d') LIKE :regDate")

也看到http://www.w3schools.com/sql/func_date_format.asp有关DATE_FORMAT MySQL函数的更多信息。谢谢

李良策
2023-03-14

尝试使用本机命名查询,转换用户。reg_date设置为字符串,然后将其与运算符进行比较,如设置为参数。如果是Oracle DB,则可能是:

@NamedNativeQuery(name = "getUserByRegDate", query = 
  "SELECT user FROM Users user WHERE TO_CHAR(user.reg_date, 'DD-MON-YYYY') LIKE :regDate"),
单于经纬
2023-03-14

JPA规范4.6.10

在条件表达式中使用比较运算符[NOT]的语法如下:

like_expression ::=
string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]

string_expression必须具有字符串值。pattern_value是字符串文字或字符串值输入参数...

所以,不,它在JPA2.0中不"工作";它不属于任何JPA规范的一部分,不能在喜欢的表达式中使用Date。它可能只是偶然工作,因为一些JPA提供商(哪一个?)没有检查和执行JPA规范...

 类似资料:
  • 问题内容: 我正在进行数据库迁移,并且我目前有一个带有日期的字符串列(相对于为它们设置了最佳的datetime字段)。有没有可以在MySQL中调用的函数将该字段转换为日期时间,以便可以使用该日期之前或之后的日期功能? 问题答案: 如果您的日期格式不正确,请使用:

  • 问题内容: 我要匹配具有以下格式的日期: 2010-08-27、2010 / 08/27 现在,我对实际可行的日期不是很确定,只是日期格式正确。 请告知正则表达式。 谢谢 问题答案: 您可以使用模块来解析日期: 输出: 因此,捕获将告诉您日期是否匹配: 为了允许使用各种格式,您可以测试所有可能性,或者先解析字段:

  • 我需要向MongoDB查询字段的编号:姓名、电话、电子邮件。查询应该支持语法:执行查询的更好方法是什么: 用$或查询字段数 用上述字段的值和该字段的多键索引创建数组字段 示例集合包含以下文档 当我发现所有带有姓名、电话或电子邮件且包含的文档时,应返回文档1和3。

  • 我正在寻找解决我当前问题的方法。我有一个经典的POJO由Hibernate用变量映射。 此实体以时间戳变量(2013-09-25 22:13:18.000)保存在MySQL数据库中。 我正在使用Spring表单显示保存在POJO中的数据。 编辑:我已经有了,但它只在通过窗体创建新对象时起作用,因此它将强制转换为。但是当我想用DB中的现有数据填充表单输入时,它就不起作用了。 我使用的是没有Joda

  • 我有两个输入字段fromDate和toDate(都是date)。我使用datepicker作为输入字段fromDate。toDate是只读的,并且依赖于fromDate。也就是说,toDate的日期是6+。例如,如果fromDate是11/30/2014,则toDate是12/6/2014。 我的jsp代码是 和js代码为: 谢谢

  • 问题内容: 我存储的文档包含两个字段,即startDate和endDate。我想使用输入日期运行Elastic查询,并返回其startDate和endDate包含该日期的所有文档。例如, 如果我输入的日期为2015-01-02,则此文档应出现在结果中,因为输入的日期在开始日期和结束日期字段的范围内。 我可以使用一个字段进行范围查询,但由于范围仅接受一个,因此我不知道如何使用两个日期字段: 我还需要