【问题标题】:Date between two properties in Hibernate Criteria APIHibernate Criteria API 中两个属性之间的日期
【发布时间】:2018-03-15 13:03:30
【问题描述】:

我正在尝试使用 Criteria API 获取我的数据库中两个字段之间日期的记录。我需要构建一个如下所示的查询:

select tran_date_bal from eod_acct_bal_table where acid = <MyAcid> and <BalanceDate> between eod_date and end_eod_date;

由于提供的between 不允许两个属性,因此我一直在获取日期标准。这是我目前所拥有的:

private static double getEndOfDayBalanceAsAtDate(String foracid, Date BalanceDate) {
        double balance = 0;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(EodAcctBalTable.class);
            cr.add(Restrictions.eq("acid", getAcid(foracid)));
            cr.add(Restrictions.between());//****Stuck Here***********
            balance = (Double) cr.setProjection(Projections.property("tranDateBal")).uniqueResult();
            tx.commit();
        } catch (Exception asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
        return balance;
    }

如何在坚持标准的同时生成查询?

【问题讨论】:

  • 你试过(Restrictions.between("yourDate", DateBegin, DateEnd))吗?
  • YourDate 不能作为between 的第一个参数,因为这是在 EOD_ACCT_BAL_TABLE 中寻找字段属性
  • BalanceDate 是 EOD_ACCT_BAL_TABLE 中的字段属性所以!
  • BalanceDate 是日期类型的输入参数

标签: java sql hibernate oracle11g


【解决方案1】:

Restrictions.between 只接受值,所以你不能在这里使用它,恐怕。

您可以使用lege 构建等效查询:

cr.add(Restrictions.le("eod_date", /** balance date **/));
cr.add(Restrictions.ge("eod_date_end", /** balance date **/));

另一种选择是使用sqlRestriction

cr.add(Restrictions.sqlRestriction("? between eod_date and eod_date_end", /** balance date **/, StandardBasicTypes.DATE ));

【讨论】:

  • balanceDate 是日期类型的输入参数,不是字段。
  • 是的,看起来更好,抱歉,在将 BalanceDate 分配给通配符之前,我从未在 hibernate 中使用过通配符?
  • @ErrorNotFoundException 此重载接受单个参数,您只需将余额日期传递给方法(代替注释)。
  • 我知道,我在询问 SqlRestriction。
  • @ErrorNotFoundException 是的,它接受余额日期(在示例调用中查找 /** balance date **/)作为参数值(? 的值)。见the javadoc for method
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多