下面是mysql查询,它工作正常并在mysql控制台上给我预期的结果。
select * from omni_main as t where t.date_time BETWEEN STR_TO_DATE(CONCAT('2011', '08', '01'),'%Y%m%d') AND LAST_DAY(STR_TO_DATE(CONCAT('2012', '08','01'), '%Y%m%d')) group by year(date_time),month(date_time)
我需要它的JPA等效查询。以下是我正在尝试的但它没有返回任何内容。
String queryStr = "select * from OmniMainEntity o where o.dateTime BETWEEN STR_TO_DATE(CONCAT('"+fromYear+"', '"+fromMonth+"','01'), '%Y%m%d') AND "
+"LAST_DAY(STR_TO_DATE(CONCAT('"+toYear+"', '"+toMonth+"','01'), '%Y%m%d'))";
Query query = manager.createQuery(queryStr);
System.out.println("Result Size: "+query.getResultList().size());
此处fromYear
,fromMonth
,toYear
,toMonth
是在创建queryStr
时使用的方法参数。
请建议我可能错在哪里!
欢迎任何其他实现目标的方式!
答案 0 :(得分:1)
当您使用JPA Query时,最好不要使用数据库指定的sql函数,例如STR_TO_DATE。
你可以通过这种方式尝试。(一种Hibernate方式,JPA应该类似):
首先,您可以解析来自“fromYear”和“fromMonth”的java.util.Date对象,如下所示:
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Date startDate = df.parse(fromYear + "" + fromMonth + "01");
Date endDate = df.parse(.....);
然后,将它们设置为JPA查询。
String queryStr = "select * from OmniMainEntity o where o.dateTime BETWEEN :startDate AND :endDate)"; // The query now changed to database independent
Query query = manager.createQuery(queryStr);
query.setDate("startDate", startDate);
query.setDate("endDate", endDate);
最后,进行搜索:
System.out.println("Result Size: "+query.getResultList().size());
答案 1 :(得分:0)
您的查询中没有动词。你可能想要SELECT
:
SELECT o FROM OmniMainEntity o WHERE...
此外,您应该使用参数化和类型化查询,并且通常使用短名称(o
而不是omniMainEnt
)来使您的查询可读。