1

以下は、正常に動作し、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()); 

ここfromYearfromMonthtoYeartoMonthは、 を作成する際に使用するメソッド パラメータqueryStrです。

私が間違っているかもしれない場所を提案してください!

目標を達成するための他の方法も大歓迎です!

4

2 に答える 2

1

JPA Query を使用しているため、STR_TO_DATE などのデータベース固有の SQL 関数は使用しない方がよいでしょう。

この方法で試すことができます(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());
于 2013-09-11T07:39:50.167 に答える
0

クエリに動詞が含まれていません。あなたはおそらくSELECTそこに欲しい:

SELECT o FROM OmniMainEntity o WHERE...

また、パラメータ化された型指定されたクエリを使用する必要があります。クエリを読みやすくするために、(oの代わりに) 短い名前を使用するのが通常です。omniMainEnt

于 2013-09-11T05:34:15.983 に答える