2012-10-27 79 views
0

我想知道如何查询数据库使用2.0中的模型与像我下面列出的查询。我没有看到一个选项将直接传入到play framework 2.0中。Java的播放框架2.0.4 ebean查询

我想从特定月份得到费用清单。

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

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

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

更新

感谢尼克,我想你有确切的代码,以日期时间和我尝试使用下面的代码,它不返回任何费用。难道我做错了什么?

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; 

回答

3

我看到两个选项:

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服务器不可移植(如果您不打算使用多个数据库引擎,则无关紧要)。

+0

我更新了初始后,你介意考虑看看? – user724535

+0

关于您的更新,我没有看到您的代码有任何特定问题,您是否恰好在2012年1月份在您的数据库中有费用? –

+0

是的,我做,如果我做Expenses.all()我得到一些费用,但与日期,它不起作用。我很困惑。 – user724535

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

对于第一种情形中Expense模型中被覆盖的save()方法都能看即是这样的:

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