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