16

私はHibernate4を使用しており、検索結果を取得するためにJSFページにフィルターがあります。検索の実行中に、次の例外が発生します

java.lang.IllegalArgumentException:パラメーター値[568903]が、org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370)の期待されるタイプ[java.lang.Long]とorg.hibernate.ejb.AbstractQueryImpl.registerParameterBindingで一致しませんでした(AbstractQueryImpl.java:343)at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370)at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:323)

以下は私のコードスニペットです、どうすればこの問題を修正できますか?

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) {
4

3 に答える 3

15

永続属性 projectNo の type は であるためLong、ParameterExpression を作成する際の type 引数は である必要があります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));
于 2013-03-05T19:00:40.037 に答える
3

あなたのDAOクラスではprojectNo、文字列として取得しています:

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

ただし、モデル クラスではprojectNo、Long として定義しています。

この行で DAO にパラメーターを設定すると、次のようになります。

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

パラメータを文字列として設定しています。その行を次のように変更してみてください (null チェック済みであると仮定しますprojectNo)。

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

projectNoまた、 を呼び出す前に が数値であることを確認することも、おそらく害にはなりません (防御プログラミング) Long.parseLongこれは、 Apache Commons の StringUtils.isNumericで実行できます。

于 2013-03-05T17:12:44.580 に答える
3

projectNolongDAO の型なので、 に変更しlongます。

これを試して:

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

変更する必要があると思います:

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

ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo"); 
于 2013-03-05T17:08:23.153 に答える