带有2个参数的java jpql查询

时间:2016-10-23 11:08:45

标签: java jpql

我遇到了带有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;

1 个答案:

答案 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。