java - 为什么 JPA TypedQuery 抛出异常 : Parameter value [. ..] 与预期类型 [java.lang.Character] 不匹配?

标签 java mysql jpa

我搜索了类似的问题,发现没有一个对我这个特别奇怪的问题有帮助的。异常消息似乎可以理解,但是对其原因的合理引用以及在哪里进行适当的更正仍然让我困惑......我就像 为什么是预期的类型 java.lang.Character???

我有一个HashMap<String, Object>params它包含我需要用来过滤 MySQL 数据库查询结果的所有搜索参数,因此以下是我使用 JPA Criteria API 构建查询的方法。

目的是搜索所有指定的dbColumns对于作为参数传递的字符串 search

List<String> dbColumns = Arrays.asList("firstname", "lastname", "username", "email", "mobilenumber", "dateJoined");

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Client> cq = cb.createQuery(Client.class);
Root<Client> entity = cq.from(Client.class);
cq.select(entity);

List<Predicate> predicates = new ArrayList<Predicate>();
if(params.containsKey("search") && StringUtils.isNotBlank(search)){
    String search = String.valueOf(params.get("search"));
    for(String column : dbColumns){
        predicates.add(cb.like(cb.lower(entity.get(column).as(String.class)), "%"+search.toLowerCase()+"%")); 
    }
}

cq.where(predicates.toArray(new Predicate[]{}));
TypedQuery<Client> query = em.createQuery(cq); //<--- Error gets thrown here
return query.getResultList();

但是我不断收到此错误。 参数值 [%tunji%] 与此行的预期类型 [java.lang.Character] 不匹配 TypedQuery<Client> query = em.createQuery(cq);

请参阅下面的 StackTrace 片段;

Caused by: java.lang.IllegalArgumentException: Parameter value [%tunji%] did not match expected type [java.lang.Character]
    at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler$1$1.bind(CriteriaQueryCompiler.java:194) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:247) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:622) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.jboss.as.jpa.container.AbstractEntityManager.createQuery(AbstractEntityManager.java:96) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]

这实际上让我感到困惑,因为我没有提及 java.lang.Character在任何时候。还有除 dateJoined 之外的所有 MySQL 列属于 VARCHAR 类型,应映射到 java 的 String 类型。

dbColumn dateJoined是 MySQL 类型 DATETIME 因此我使用 entity.get(column).as(String.class)这样日期的字符串表示形式将与 search 进行比较字符串。

所以我想知道这个错误的原因可能是什么以及如何最好地解决这个问题。任何帮助将不胜感激。

EDIT:

回应@Ish...这就是 Client 的内容实体看起来像

@Entity
@Table(name="client")
@NamedQueries({
    @NamedQuery(name="Client.findAll", query="SELECT c FROM Client c")
})
public class Client implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    private int id;

    @Column(length=255)
    private String email;

    @Column(length=50)
    private String firstname;

    @Column(length=50)
    private String lastname;

    @Column(length=20)
    private String mobilenumber;

    @Column(unique=true, length=255)
    private String username;

    @Column(nullable=false, name="datejoined")
    private Date dateJoined;

    //... getters ... and ... setters
}

最佳答案

日期无法转换为字符串。请参阅this 。您对Expression.as()的了解方法并不是现实中发生的事情。

关于java - 为什么 JPA TypedQuery 抛出异常 : Parameter value [. ..] 与预期类型 [java.lang.Character] 不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149848/

相关文章:

java - GridLayout 不会显示在网格中

mysql - 数据库查询未提取完整(或正确)信息

java - Hibernate ManyToOne 保存。拯救没有 child 的 parent 。但应该根据特定属性来搜索 Child

java - 当我在 tomcat 中部署 shopizer.war 时出现以下错误

java - DrawerToggle 汉堡图标未显示

java - 从 Google Drive API v3 下载 Gdoc 修订版

java - JPA 1.0 错误 : The name is not a recognized entity or identifier. 已知实体名称:[]

MySQL 查询,其中数据显示在行而不是列中

php - 如何在MySql DATETIME查询中添加#from和#to?

java - 具有连接和排序依据的查询生成器?