0

我想知道如何使用 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;
4

2 回答 2

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 文档

raw sql 的主要缺点是这段代码不能移植到不同的 SQL 服务器上(如果你不打算使用多个 db 引擎,那没关系)。

于 2012-10-27T12:01:59.673 回答
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字段: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 回答