尝试使用命名查询在日期字段上使用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中运行正常。
答案 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。 感谢。