在namedquery Eclipselink

时间:2015-06-11 17:59:53

标签: java jpa eclipselink

在实体类中使用namedQuery时出错

  @NamedQuery(name = "Classification.search", query = "SELECT c FROM Classification c WHERE c.id LIKE  :value")

调用namedQuery的方法

public List<Classification> search(String value) {
    Query query = getEntityManager().createNamedQuery("Classification.search", Classification.getClass()).setParameter("value", "%"+value+"%");
    query.setMaxResults(10);
    return query.getResultList();
}
  

java.lang.IllegalArgumentException:您试图为参数值设置类型类java.lang.String的值,具有类java.lang.Integer的预期类型来自查询字符串SELECT c FROM Classification c WHERE c.id LIKE :值

但是使用此方法时没有错误。

public List<Classification> findLimited(String _clasif, int maxResult) {
    String querySt = "SELECT c FROM Classification c WHERE c.id LIKE '%" + _clasif + "%'";
    Query query = em.createQuery(querySt);
    query.setMaxResults(maxResult);
    List<Classification> classif;
    classif = query.getResultList();
    if (classif != null) {
        return classif;
    }
    return new ArrayList<>();
}

我使用eclipselink 2.6和JPA

2 个答案:

答案 0 :(得分:0)

根据JPQ的BNF,&#34; LIKE&#34;仅用于String值。与非String值一起使用只是供应商扩展,因此依赖于供应商。它是命名查询的一部分还是标准或基于字符串的JPQL是无关紧要的。

like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]

答案 1 :(得分:0)

我通过这段代码解决了这个问题。

plink.exe -serial -sercfg ... < input.txt

此方法通过nameKey和class从实体类获取namedQuery字符串。

public List<Classification> search(String value) {
    Query query = getEntityManager().createQuery(getNamedQueryCode(entityClass, "Classification.search").replace(":value", value));
    query.setMaxResults(10);
    return query.getResultList();
}