Java play framework 2.0.4 ebean查询

时间:2012-10-27 05:31:34

标签: java playframework playframework-2.0 ebean

我想知道如何使用play 2.0中的模型查询数据库,查询类似于下面列出的查询。我没有看到将直接sql传递到play framework 2.0的选项。

我正在尝试获取特定月份的费用清单。

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

我看到的选项是查询所有费用,然后使用Date对象解析每个费用的月份。

我认为应该有一种有效的方法,我似乎找不到使用ebean和Java play framework 2.0来执行此查询的方法。

更新

谢谢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;

2 个答案:

答案 0 :(得分:4)

我看到两个选项:

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 documentation

原始sql的主要缺点是这个代码对于不同的SQL服务器是不可移植的(如果你不打算使用多个数据库引擎,那就不重要了。)

答案 1 :(得分:1)

+1 @nico_ekito

另一方面,当你建议从数据库获取所有行然后在循环中解析它们时,我宁愿建议解析它们......同时创建和存储格式更容易搜索和索引。只需在数据库中创建其他列,并覆盖模型中的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字段:purchaseYearpurchaseMonth

对于第一个场景,save()模型中的覆盖Expense方法可能如下所示:

public void save() {
    this.purchaseDate = new Date();
    this.purchasePeriod = new SimpleDateFormat("yyyy-MM").format(this.purchaseDate);
    super.save();
}