我遇到了带有2个参数的jpql查询的问题:
这是查询:
public List<OrganizedUe> findByAcademicYear(Date start, Date end)
{
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String startFormat = format1.format(start.getTime());
String endFormat = format1.format(end.getTime());
List<OrganizedUe> list;
String queryString =
"SELECT o FROM OrganizedUe o "
+ "WHERE o.startDate >= :param1 "
+ "AND "
+ "o.endDate <= :param2 "
+ "ORDER BY o.startDate";
Query q = em.createQuery(queryString);
q.setParameter("param1", startFormat);
q.setParameter("param2", endFormat);
list = q.getResultList();
return list;
}
如果我运行此功能,我会收到来自Brownser的错误:
引起:java.lang.IllegalArgumentException:您曾尝试过 为参数param1设置类型类java.lang.String的值 期望类型的类java.util.Date来自查询字符串SELECT o FROM OrganizedUe o WHERE o.startDate&gt; =:param1 AND o.endDate&lt; =:param2 ORDER BY o.startDate。
奇怪的是,我在调试模式中查看了startDate和endFormat的值,2 String的值是YY-MM-DD,但根据错误我应该发送一个Date?
我做了另一个测试,我用这种格式硬编码:param1和:param2:'2014-09-15',在这种情况下我的功能正常工作。
您对可能出现的问题有所了解吗?
由于
编辑:
这是我的实体OrganisedUe中的开始和结束的定义:
@Basic(optional = false)
@NotNull
@Column(name = "start_date")
@Temporal(TemporalType.DATE)
private Date startDate;
@Basic(optional = false)
@NotNull
@Column(name = "end_date")
@Temporal(TemporalType.DATE)
private Date endDate;
答案 0 :(得分:0)
而不是转换为String只需使用日期变量:
q.setParameter("param1", start);
q.setParameter("param2", end);
如果您需要作为第一个日期开始并且结束第二个日期(作为整天),您可以在当天的开始/结束时设置它们:
start.setHour(0);
end.setHour(23);
start.setMinutes(0);
end.setMinutes(59);
// and the same for seconds :)
只需将时间设置为开始时的0:00:00和结束时的23:59:59。