当前位置: 首页 > 知识库问答 >
问题:

对namedquery Eclipselink中的整数值使用like

宰坚
2023-03-14

在实体类中使用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.IllegalArgumentExcture:您试图设置类型类的值java.lang.字符串的参数值与预期类型的类java.lang.整数从查询字符串SELECT c从分类c WHEREc.id喜欢:值。

但当使用这种方法时,工作不会出错。

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<>();
}

我在JPA中使用eclipselink 2.6

共有2个答案

禄俊逸
2023-03-14

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

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从实体类中获取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;
}
羊昊苍
2023-03-14

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

like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
 类似资料:
  • 我想验证传入的数字是否为0到100之间的整数值(不含分数)。 我有javax的dto。验证批注: Dto在@RestController类中用作输入方法(@PostMapping)参数。 @Min和@Max工作正常,但@Digits不行。当我发送数字时,例如95.5,它会转换为95,并引发任何异常。为什么不使用@数字进行检查?

  • 我有一个基本的疑问,我们可以增加整数类对象的引用,而不是任何其他类的引用(D类有1个整数数据成员和一个参数化构造函数)。 这里x和d都是引用,但我们仍然可以增加整数引用,而不增加任何其他引用。我错过了一些非常基本的东西,请帮助我。

  • null 只使用数据类型有什么特别的缺点吗? 使用数据类型代替数据类型有意义吗?

  • 如何计算下面代码中的整数值: 我想实现如果0是超过1所以将打印假如果1是超过0将打印真

  • IntegerStringConverter方法工作得更好:不接受所有像“-16-123”这样的无效数字,而像“0123”这样的数字被转换为“123”。但是只有当文本被提交(通过按enter键)或TextField失去焦点时,才会发生转换。 是否有一种方法可以在每次更新TextField的值时用IntegerStringConverter强制转换第二个方法?

  • 我正在使用BufferedReader类读取Java程序中的输入。我想从一个用户那里读取输入,这个用户可以在一行空格中输入多个整数数据。我想读取整数数组中的所有这些数据。 输入格式-用户首先输入他/她想要输入的数字 然后在下一行中输入多个整数值- 输入: 5. 2 456 43 21 12 现在,我使用BufferedReader的对象(br)读取输入 接下来,我想读取数组中的下一行输入 但是我们