【问题标题】:Passing a parameter in a jpql query select在 jpql 查询中传递参数选择
【发布时间】:2016-03-29 23:24:07
【问题描述】:

我有一个 jpql 查询在 select 子句中实例化一个 java 对象

public List<ChampEtatOT> getEtatOT(Date dateDebut, Date dateFin) {      
    Query query = em.createQuery("SELECT NEW ChampEtatOT( ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle , ot.dateFinReelle, :dateParam1, :dateParam2, :dateParam3) FROM ordre ot  JOIN ot.unite uo")
            .setParameter("dateParam1", dateDebut, TemporalType.DATE)
            .setParameter("dateParam2", dateFin, TemporalType.DATE)
            .setParameter("dateParam3", new Date("2015-01-01"), TemporalType.DATE);
    return query.getResultList();
}

我放了3个参数,所以我可以在构造函数中传递它 我收到此错误

Caused by: Exception [EclipseLink-6137] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryExceptionException Description: An Exception was thrown while executing a ReportQuery with a constructor expression: java.lang.NoSuchMethodException: dz.elit.gmao.commun.reporting.classe.ChampEtatOT.<init>(java.lang.String, java.lang.String, java.lang.String, java.util.Date, java.util.Date)Query: ReportQuery(referenceClass=TravOrdreTravail jpql="SELECT NEW dz.elit.gmao.commun.reporting.classe.ChampEtatOT( ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle , ot.dateFinReelle, :dateParam1, :dateParam2, :dateParam3) FROM TravOrdreTravail ot  JOIN ot.uniteOrganisationnellle uo")

我认为不能将参数放在select子句中所以有人有想法,构造方法如下:

public ChampEtatOT(String numero, String denominationFr, String etat, Date dateDebutReelle, Date dateFinReelle, Date dateParam1, Date dateParam2, Date dateParam3) {
    this.numero = numero;
    this.denominationFr = denominationFr;

    if (etat.equals("OUV")) {
        if (dateDebutReelle.before(dateParam1)) {
            etatEntreeSortie = "En instance debut du mois";
        } else {
            if (dateDebutReelle.before(dateParam2)) {
                etatEntreeSortie = "En instance fin du mois";
            } else {
                if (dateDebutReelle.after(dateParam1) && dateDebutReelle.before(dateParam2)) {
                    etatEntreeSortie = "Entree/Mois";
                }
            }
        }
    } 
}

【问题讨论】:

    标签: java jpa jakarta-ee jpql


    【解决方案1】:

    问题已解决,正如您建议的 bRIMOs Bor 无法在 SELECT 子句中传递参数,因此我已检索列表中的所有结果,而不是根据三个日期 date1、date2、date3 过滤结果

    Query query = em.createQuery("SELECT NEW ChampEtatAteliers"
                + "( ot.numero, uo.denominationFr, ot.etat, ot.dateDebutReelle, ot.dateFinReelle) "
                + "FROM ordre ot  JOIN ot.unite uo");
        List<ChampEtatAteliers> champEtatAtelierses = query.getResultList();
    
        for (ChampEtatAteliers champEtatAtelierse : champEtatAtelierses) {
    
            if (champEtatAtelierse.getDateDebutReelle().compareTo(date1) >= 0 && champEtatAtelierse.getDateDebutReelle().compareTo(date2) <= 0) {
                champEtatAtelierList2.add(new ChampEtatAteliers(champEtatAtelierse.getNumero(), champEtatAtelierse.getDenominationFr(), "Entree/Mois"));
            }
    
            if (champEtatAtelierse.getEtat().equals("OUV")) {
                if (champEtatAtelierse.getDateDebutReelle().compareTo(date1) < 0) {
                    champEtatAtelierse.setEtatEntreeSortie("En instance début du mois");
                } else {
                    if (champEtatAtelierse.getDateDebutReelle().compareTo(date2) <= 0) {
                        champEtatAtelierse.setEtatEntreeSortie("En instance fin du mois");
                    }
                }
            } 
        }
    

    【讨论】:

    • 这实际上是错误的,如果您查看第一条评论,链接的问题就会显示。这是 JPA 提供程序中的一个 BUG。您的“答案”只是此错误的解决方法
    • 有人写过这样的错误报告吗?
    【解决方案2】:

    我认为不可能在构造函数中引用参数。 在您的情况下,它会引发 NoSuchMethodexeption :这意味着,在您的 ChampEtatOT 类中没有具有当前签名的方法(5 个参数而不是 8 个)

    你可以参考这个答案=>Passing a parameter in a jpql query select

    所以,尝试检索所有数据,然后创建一个过滤方法来设置 ResultList 的 ChampEtatOT 类中的所有 etatEntreeSortie

    【讨论】:

    • 这实际上是错误的,如果您查看第一条评论,链接的问题会说。这是 JPA 提供程序中的一个 BUG。
    【解决方案3】:

    显然JPQL BNF 确实允许将参数作为构造函数参数传递。

    constructor_expression ::= NEW constructor_name ( constructor_item {, constructor_item}* )
    constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression |
        identification_variable
    scalar_expression ::= simple_arithmetic_expression | string_primary | enum_primary |
        datetime_primary | boolean_primary | case_expression | entity_type_expression
    string_primary ::= state_field_path_expression | string_literal |
        input_parameter | functions_returning_strings | aggregate_expression | case_expression
    

    scalar_expression可以是string_primary,也可以是input_parameter。所以你的 JPA 提供者不符合 JPA 规范,你应该提出一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 2016-04-05
      • 2017-08-14
      • 2018-11-07
      • 2014-10-18
      • 2019-07-11
      • 2014-03-22
      • 2013-10-23
      相关资源
      最近更新 更多