【问题标题】:Java play framework 2.0.4 ebean queryJava play framework 2.0.4 ebean查询
【发布时间】:2012-10-27 05:31:34
【问题描述】:

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

【问题讨论】:

    标签: java playframework playframework-2.0 ebean


    【解决方案1】:

    我看到两个选项:

    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服务器上(如果你不打算使用多个数据库引擎,那没关系)。

    【讨论】:

    • 关于您的更新,我没有看到您的代码有任何特殊问题,您的数据库中是否恰好有 2012 年 1 月的费用?
    • 是的,如果我做 Expenses.all() 我会得到一些费用,但是对于日期,它不起作用。我真的很困惑。
    • 请显示您的 Expense 类中的相关代码(相关属性和方法)。
    • 它与其他东西有关,它的工作。感谢您的帮助! Play 框架非常好用,但需要更多文档!
    【解决方案2】:

    @nico_ekito +1

    另一方面,虽然您建议从数据库中获取所有行,然后在循环中解析它们,但我宁愿建议解析它们......同时以更易于搜索和索引的格式创建和存储。只需在您的数据库中创建额外的列,并在您的模型中覆盖save() 和/或update(Object o) 方法,以确保每次更改都会设置该字段,即使用String purchasePeriod 来存储像@987654324 这样的字符串@;

    你可以找到:

    # 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      相关资源
      最近更新 更多