2016-09-30 56 views
0

我正在使用命名查询在日期字段上使用LIKE表达式执行查询,如下所示;使用类似表达式的日期字段使用JPA 2.1

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的值 参数:与类java.util.Date中的预期类型regDate ...

我该如何解决当在JPA 2.1上运行?它在JPA 2.0中运行正常。

+0

由于日期不是字符串(LIKE被定义为要采用),你期望的是什么? –

+0

@NeilStockton在JPA 2.0中完美工作。 – kabugima2

+0

'LIKE'用于字符串,不适用于日期(或数字) –

回答

0

尝试使用本地命名查询,将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"), 
+1

感谢Boris,您的回答让我朝着正确的方向前进。我已经使用了像这样的NamedQuery; @NamedQuery(name =“getUserByRegDate”,query =“SELECT user FROM Users user WHERE FUNCTION('TO_CHAR',user.reg_date,'yyyy-MM-dd')LIKE:regDate”)。 – kabugima2

1

JPA规范4.6.10

对于使用比较操作符的语法[NOT] LIKE在 条件表达式如如下:

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

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

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

0

关键是使用DB函数'TO_CHAR'(ORACLE)或MySQL函数' date_format',那么用户FUNCTION IN @NamedQuery如下所示;

Oracle数据库

@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") 

另见​​有关DATE_FORMAT MySQL的函数的详细信息。 谢谢。

相关问题