使用JPA 2.1在Date Field中使用Like Expression

时间:2016-09-30 14:06:24

标签: java jpa

尝试使用命名查询在日期字段上使用LIKE表达式执行查询,如下所示;

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.lang.String设置类型的值   参数:regDate与期望类型java.util.Date ...

如何在JPA 2.1上运行时解决此问题?它在JPA 2.0中运行正常。

3 个答案:

答案 0 :(得分:2)

JPA spec 4.6.10

  

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

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

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

所以不,它在JPA 2.0中“工作”;在LIKE表达式中使用Date是任何JPA规范的一部分。它可能只是偶然工作,因为一些JPA提供商(哪一个?)没有检查并执行JPA规范...

答案 1 :(得分:1)

尝试使用本机命名查询,将user.reg_date转换为字符串,然后将其与运算符like进行比较。对于Oracle DB,例如:

@NamedNativeQuery(name = "getUserByRegDate", query = 
  "SELECT user FROM Users user WHERE TO_CHAR(user.reg_date, 'DD-MON-YYYY') LIKE :regDate"),

答案 2 :(得分:0)

关键是使用数据库功能&#39; TO_CHAR&#39; (ORACLE)或MySQL函数&#39; date_format&#39;然后在@NamedQuery中使用FUNCTION,如下所示;

ORACLE DB

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

<强>的MySQL

更改&#39; TO_CHAR&#39;以上到&#39; date_format&#39;

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

有关DATE_FORMAT MySQL函数的更多信息,另请参阅http://www.w3schools.com/sql/func_date_format.asp。 感谢。