以jpa代替月,年,日期函数

时间:2013-04-04 05:14:08

标签: java jpa orm jpql

我想在JPA中执行此查询。但是我在执行此查询时遇到错误。如何在JPA中使用Month(),Year() 我们可以在本机SQL Query中使用它们。但是如何使用它? 请帮帮我。谢谢!

 select model from IptExchangeratelines model where model.iptExchangerate.id=:id and " +
                " month(model.currencyExchangeDate)=:month and year(model.currencyExchangeDate)=:year

3 个答案:

答案 0 :(得分:11)

很少有JPA实现内置对日期/时间函数的支持。

  • <强>的EclipseLink

      

    EclipseLink支持EXTRACT,允许任何数据库支持的日期/时间部分值   从日期/时间中提取。 EXTRACT函数与数据库无关,但需要数据库支持。

    EXTRACT(YEAR, model.currencyExchangeDate),但它需要EclipseLink 2.4.x

      

    FUNC 允许从JPQL调用数据库函数。它允许调用JPQL中不直接支持的任何数据库函数。

    要调用数据库函数MyFunc(a, b, c),请使用FUNC('MyFunc', a, b, c)

    您可以尝试FUNC('YEAR', currencyExchangeDate)来调用'年'功能。

  • <强>休眠

    在HQL中,您可以使用日期函数YEAR(date)MONTH(date)DAY(date)来提取所需的详细信息。 支持的其他时间函数包括HOUR(date)MINUTE(date)SECOND(date)

  • 标准API

      

    CriteriaBuilder #function():为执行数据库函数创建一个表达式。

    CriteriaQuery<IptExchangeratelines> cq = cb.createQuery(IptExchangeratelines.class); Root<IptExchangeratelines> exRateLine = cq.from(IptExchangeratelines.class); cq.where(cb.equal(cb.function("year", Integer.class,
    exRateLine.get(exRateLine_.currencyExchangeDate)), year) .and(cb.equal(cb.function("month", Integer.class, exRateLine.get(exRateLine_.currencyExchangeDate)), month)));

答案 1 :(得分:1)

DataNucleus JPA jhas支持YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,以及JPA 2.1标准&#34; FUNCTION&#34;用于在RDBMS中调用本机函数。

根据我的经验,所有JPA实现都支持这样的事情,这与其他答案给出的印象不同

答案 2 :(得分:0)

亲爱的

有时候我们不得不以不同的方式思考,也许这可以有所帮助:

TypedQuery<Number> query = entityManager.createQuery(
                "SELECT SUM(COALESCE(p.amount, 0)) FROM Payment p WHERE p.paymentDate BETWEEN ?1 AND ?2", Number.class);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.MONTH, month -1);
        calendar.set(Calendar.YEAR, year);

        query.setParameter(1, calendar.getTime());
        //the location is very important
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.MILLISECOND, -1);

        query.setParameter(2, calendar.getTime());
        return query.getSingleResult().doubleValue();