在 namedquery Eclipselink 中对整数值使用 like

use like for integer value in namedquery Eclipselink

在实体 class 中使用 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: You have attempted to set a value of type class java.lang.String for parameter value with expected type of class java.lang.Integer from query string SELECT c FROM Classification c WHERE c.id LIKE :value.

但是当使用这个方法时没有错误。

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 一起使用

根据 JPQL 的 BNF,"LIKE" 仅用于字符串值。与非字符串值一起使用只会是供应商扩展,因此依赖于供应商。它是命名查询或条件的一部分还是基于字符串的 JPQL 是无关紧要的。

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

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

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

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

private String getNamedQueryCode(Class<? extends Object> clazz, String namedQueryKey) {
    NamedQueries namedQueriesAnnotation = clazz.getAnnotation(NamedQueries.class);
    NamedQuery[] namedQueryAnnotations = namedQueriesAnnotation.value();

    String code = null;
    for (NamedQuery namedQuery : namedQueryAnnotations) {
        if (namedQuery.name().equals(namedQueryKey)) {
            code = namedQuery.query();
            break;
        }
    }

    if (code == null) {
        if (clazz.getSuperclass().getAnnotation(MappedSuperclass.class) != null) {
            code = getNamedQueryCode(clazz.getSuperclass(), namedQueryKey);
        }
    }

    //if not found
    return code;
}