【问题标题】:Hibernate Parameter value [568903] did not match expected type [java.lang.Long]Hibernate 参数值 [568903] 与预期类型 [java.lang.Long] 不匹配
【发布时间】:2013-02-20 05:00:39
【问题描述】:

我正在使用 Hibernate 4,并且我在 JSF 页面中有一个过滤器来获取搜索结果。在执行搜索期间,我收到以下异常

java.lang.IllegalArgumentException:参数值 [568903] 不匹配 预期类型 [java.lang.Long] 在 org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) 在 org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343) 在 org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370) 在 org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:323)

下面是我的代码 sn-p,我该如何解决这个问题?

private Long projectNo; 

public Long getProjectNo() {
    return projectNo;
}

public void setProjectNo(Long projectNo) {
    this.projectNo = projectNo;
}

在 DAO 类中,我有以下内容

String projectNo = filters.get("projectNo");
List<Predicate> criteria = new ArrayList<Predicate>();
    if (projectNo!= null) {
    ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo");             
    Predicate predicate = cb.equal(emp.get(Project_.projectNo), pexp);
    criteria.add(predicate);
}
TypedQuery<Project> q = entityManager.createQuery(c);
TypedQuery<Long> countquery = entityManager.createQuery(countQ);
q.setParameter("projectNo", projectNo); // error in this line
countquery.setParameter("projectNo", projectNo);

编辑 1

public void getProjects(ProjectQueryData data) { 

ProjectQueryData 类中,我有以下构造函数

public ProjectQueryData (int start, int end, String field,
            QuerySortOrder order, Map<String, String> filters) {

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

    projectNolong 在 DAO 中输入,因此将其更改为 long

    试试这个:

    q.setParameter("projectNo", new Long(projectNo));
    

    我认为你应该改变:

    ParameterExpression<String> pexp = cb.parameter(Long.class, "projectNo"); 
    

    ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo"); 
    

    【讨论】:

    • 以下错误java.lang.IllegalArgumentException: Named parameter [projectNo] type mismatch; expecting [java.lang.String], found [java.lang.Long]
    • 你把 ParameterExpression<string> pexp = cb.parameter(String.class, "projectNo");</string> 改成:ParameterExpression pexp = cb.parameter( Long.class, "projectNo");
    • @PSR 对不起,我没有包括那个。过滤器是Map&lt;String, String&gt; filters = data.getFilters();
    • @PSR 我在原始问题中将该代码添加为编辑 1。
    • @PSR 我在一个类和这个类中有以下方法extends LazyDataModelpublic List&lt;Project&gt; load(int first, int pageSize, String sortField, SortOrder sortOrder, Map&lt;String, String&gt; filters) {
    【解决方案2】:

    因为持久属性projectNo的类型是Long,所以创建ParameterExpression时的类型参数应该是Long。因此,因为 ParameterExpression 的类型是Long,所以参数值的类型也应该是 Long:

    //because this persistent Attribute is Long:
    private Long projectNo; 
    
    //we use Long here as well
    ParameterExpression<Long> pexp = cb.parameter(Long.class, "projectNo");
    ...
    //and finally set parameter. Long again, because that is the type 
    // type of ParameterExpression:
    query.setParameter("projectNo", Long.valueOf(projectNo));
    

    【讨论】:

    • Mikko,非常感谢,这确实有助于解决问题。非常感谢。
    • +1 干得好,看起来您能够将所有内容拼凑在一起,以获得有效的连贯答案!
    【解决方案3】:

    在您的 DAO 类中,您将获得 projectNo 作为字符串:

    String projectNo = filters.get("projectNo");
    

    但是,在您的模型类中,您将 projectNo 定义为 Long。

    当你在你的 DAO 中设置参数时:

    q.setParameter("projectNo", projectNo); // error in this line
    

    您将参数设置为字符串。尝试按如下方式更改该行(假设您已对 projectNo 进行了空检查):

    q.setParameter("projectNo", Long.parseLong(projectNo));
    

    在调用Long.parseLong 之前确保projectNo 是数字也可能不会受到伤害(防御性编程)。您可以使用Apache Commons StringUtils.isNumeric 执行此操作。

    【讨论】:

    • 向您的项目添加数兆字节的 Apache 库以获得一种 util 方法并不是防御性的,这实际上是个坏主意。在这种情况下,一个简单的 try/catch 就可以了。
    猜你喜欢
    • 2015-12-13
    • 2014-04-06
    • 2016-07-13
    • 2018-08-17
    • 2019-02-11
    • 2019-08-26
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多