在jpql查询中传递参数select

时间:2015-12-23 13:51:09

标签: java jpa java-ee jpql

我有一个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";
                }
            }
        }
    } 
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

问题解决了,正如你所建议的那样bRIMO Bor它不可能在SELECT子句中传递参数,所以我已经在List中检索了所有结果,而不是根据日期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");
                }
            }
        } 
    }

答案 2 :(得分:0)

显然,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 确实允许将参数作为构造函数参数传递。

{{1}}

scalar_expression 可以是 string_primary ,它可以是 input_parameter 。因此,您的JPA提供程序不符合JPA规范,您应该提出错误。

相关问题