3

我想在 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
4

3 回答 3

11

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

  • EclipseLink

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

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

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

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

    您可以尝试FUNC('YEAR', currencyExchangeDate)调用“YEAR”函数。

  • 休眠

    在 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)));

于 2013-04-04T08:24:51.570 回答
1

DataNucleus JPA 内置了对 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND 的支持,以及用于在 RDBMS 中调用本机函数的 JPA 2.1 标准“FUNCTION”。

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

于 2014-08-05T10:20:44.220 回答
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();
于 2020-03-15T08:15:19.990 回答