0

以下にリストしたようなクエリを使用して、play 2.0 のモデルを使用してデータベースをクエリする方法を考えています。Play フレームワーク 2.0 に直接 SQL を渡すオプションはありませんでした。

特定の月の費用のリストを取得しようとしています。

SELECT * FROM Expensesdb.expense
WHERE month(expense.purchase_date) = 01

私が見るオプションは、すべての費用を照会し、Date オブジェクトを使用してリストされている月のそれぞれを解析することです。

効率的な方法があるはずだと思います.Java play Framework 2.0でebeanを使用してこのクエリを実行する方法を見つけることができないようです.

アップデート

Nico に感謝します。DateTime を使用して、あなたが持っている正確なコードを試しました。以下のコードを使用しようとしましたが、経費は返されません。私は何か間違ったことをしていますか?

    Calendar calendar = Calendar.getInstance();
    calendar.set(2012, 0, 01);

    Date startDate = calendar.getTime();
    calendar.set(2012, 0, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

    Date endDate = calendar.getTime();
    List<Expense> expenses = find.where().between("purchaseDate", startDate, endDate).findList();
    return expenses;
4

2 に答える 2

4

2 つのオプションが表示されます。

1 - Ebean マッピングの使用

アイデアは、次のような月の初めと終わりの間の費用を検索することです。

Datetime firstDayOfMonth= new Datetime().withDayOfMonth(1);
Datetime lastDayOfMonth = new Datetime().dayOfMonth().withMaximumValue();
return finder.where()
    .between("purchaseDate", firstDayOfMonth, lastDayOfMonth).findList();

2 - RawSQL の使用

これについては、 Ebean のドキュメントをご覧ください。

raw sql の主な欠点は、このコードが異なる SQL サーバーに移植できないことです (複数の db エンジンを使用する予定がない場合は問題ありません)。

于 2012-10-27T12:01:59.673 に答える
1

@nico_ekitoの +1

一方、DB からすべての行を取得してからループで解析することを提案している間は、それらを解析することをお勧めします...検索とインデックス作成が容易な形式で作成および保存します。DBに追加の列を作成し、モデルにオーバーライドsave()および/またはupdate(Object o)メソッドを作成して、すべての変更がフィールドを設定するString purchasePeriodようにし2012-11ます。

次に見つけることができます:

# in November of ANY year
SELECT * FROM table WHERE purchase_period LIKE '%-11';

# in whole 2012 
SELECT * FROM table WHERE purchase_period LIKE '2012-%';

# in December 2012
SELECT * FROM table WHERE purchase_period LIKE '2012-12';

Integerまたは、2 つのフィールドに分割することもできます: purchaseYear, purchaseMonth.

最初のシナリオでは、モデルのオーバーライドsave()されたメソッドは次のようになります。Expense

public void save() {
    this.purchaseDate = new Date();
    this.purchasePeriod = new SimpleDateFormat("yyyy-MM").format(this.purchaseDate);
    super.save();
}
于 2012-10-27T13:45:07.557 に答える