2013年10月2日水曜日

Play FrameworkでRawSQLの実行例

Play Framework for JavaでORMにEbeanを使った際の直SQLの書き方の一例です。
ネットで探しても日本語による情報がなかなか無いので書いておきます。

public static List<DateItemBean> getTweetResultListGroupByDate(Item item) {
String sql = " SELECT created_at,"
+ " COUNT( CASE WHEN POINT = 0 THEN 1 ELSE NULL END ) AS neutral,"
+ " COUNT( CASE WHEN POINT > 0 THEN 1 ELSE NULL END ) AS positive,"
+ " COUNT( CASE WHEN POINT < 0 THEN 1 ELSE NULL END ) AS negative"
+ " FROM tweet" + " WHERE item_id = :item_id"
+ " GROUP BY DATE_FORMAT( created_at,  '%Y%m%d' )"
+ " ORDER BY created_at ASC";
List<SqlRow> sqlRows = Ebean.createSqlQuery(sql)
.setParameter("item_id", item.itemId).findList();
List<DateItemBean> results = new ArrayList<DateItemBean>();
for (SqlRow row : sqlRows) {
Date date = row.getDate("created_at");
Integer countNeutral = row.getInteger("neutral");
Integer countPositive = row.getInteger("positive");
Integer countNegative = row.getInteger("negative");
DateItemBean bean = DateItemBeanService.setDateItemBean(item,
countNeutral, countNegative, countPositive, date);
results.add(bean);
}
return results;
}



のようにしてあげることで、実行することが出来ます。 詳しいソースは以下のGithubから確認して下さい。
https://github.com/YoshiteruIwasaki/NegativePositieAnalyzerForJa/blob/master/app/services/TweetService.java

SQL 内で
:item_id
のように書いてあげることでsetParameterでbindしてあげることが出来ます。

セットされた値は
row.getInteger("neutral")
などのようにして取得することが出来ます。

なおDate型で取得する場合ですが、
DATE_FORMAT( created_at,  '%Y-%m-%d 00:00:00.000' )
みたいな感じにしてもString型にしかならなかったので、オブジェクトの方を見てるのかもしれません。よくわかりませんが・・・。