Java JPA查询相当于mysql查询

Java JPA查询相当于mysql查询,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,下面是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) 我需要

下面是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
时使用的方法参数

请告诉我哪里可能错了


任何其他实现目标的方法都是受欢迎的

您的查询中没有动词。您可能希望
在其中选择

SELECT o FROM OmniMainEntity o WHERE...

此外,您应该使用参数化和类型化查询,通常使用短名称(
o
,而不是
omnimainten
)使查询可读。

您的查询中没有动词。您可能希望
在其中选择

SELECT o FROM OmniMainEntity o WHERE...

此外,您应该使用参数化和类型化查询,通常使用短名称(
o
)而不是
omnimainten
)使查询可读。

在使用JPA查询时,最好不要使用数据库指定的sql函数,例如stru to\u 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());

在使用JPA查询时,最好不要使用数据库指定的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());

在JPA中,直到您使用createQuery而不是nativeQuery,您的代码才能在所有情况下工作databases@chrylis我确实改变了你所说的,但结果大小仍然为零!如果我错了,请纠正我:对于JPA,我们从任何obj中选择obj。。。。在使用createQuery而不是nativeQuery之前,JPA中仍然有select*,您的代码在所有情况下都可以工作databases@chrylis我确实改变了你所说的,但结果大小仍然为零!如果我错了,请纠正我:对于JPA,我们从任何obj中选择obj。。。。在db中仍然有select*dateTime值,类似于“2011-08-29 01:19:33”,搜索时我们有年份和月份。因此,您建议的方法将不起作用。数据库中的dateTime值类似于“2011-08-29 01:19:33”,对于搜索,我们有年份和月份。所以,你建议的方法行不通。