jqgridプラグインでSpringMVC3.0を使用しています。サーバー側にjsonオブジェクトを送信するjqgridの検索機能を構築しています。検索がトリガーされるたびにjqgridのjsonを解析するためのダミーのJavaクラスを作成しました。この時点まではすべて順調です。
ユーザーが検索条件(等しい、等しくないなど)を自由に選択できるため、基準クエリを動的に作成しています。これは、jqgridによって送信されたjson文字列の例です。
{
"groupOp": "AND",
"rules": [{
"field": "company",
"op": "cn",
"data": "School"},
{
"field": "numberOfStudents",
"op": "eq",
"data": "2"}]
}
これは、このJSONを解析するためのテンプレートとして使用されるJavaクラスです。
public class JsonJqgridSearchModel {
public String groupOp;
public ArrayList<JqgridSearchCriteria> rules;
}
JqgridSearchCriteriaというタイプに注意してください。これは、getRestriction()
メソッドを呼び出すたびに1つの制限を返すだけのクラスです。JqgridSearchCriteria
クラスは次のとおりです。
public class JqgridSearchCriteria {
public String field;
public String op;
public String data;
public SimpleExpression getRestriction(){
if(op.equals("cn")){
return Restrictions.like(field, data, MatchMode.ANYWHERE);
}else if(op.equals("eq")){
return Restrictions.eq(field, data);
}else if(op.equals("ne")){
return Restrictions.ne(field, data);
}else if(op.equals("lt")){
return Restrictions.lt(field, data);
}else if(op.equals("le")){
return Restrictions.le(field, data);
}else if(op.equals("gt")){
return Restrictions.gt(field, data);
}else if(op.equals("ge")){
return Restrictions.ge(field, data);
}else{
return null;
}
}
}
JSON文字列を観察すると、フィールドとデータがgetRestriction()を介してSimpleExpressionを返すために使用される理由がわかります。
これが問題です:私はObject-Bを参照として持つObject-Aを持っています。グリッドから取得しているのはObject-B.getName()であるため、field = Object-B.getName()があり、データはユーザーが指定した名前です。これを実行すると、次のような例外が発生します。JqgridSearchCriteria
Internal Error
Sorry, we encountered an internal error.
Details
could not get a field value by reflection getter of tt.edu.sbcs.model.Organization.id
org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)
org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:142)
org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1789)
org.hibernate.loader.Loader.bindParameterValues(Loader.java:1760)
.
.
.**
これがすべてが一緒になる場所のスニペットです。
Criteria criteria = session.createCriteria(CorporateRegistration.class);
Iterator<JqgridSearchCriteria> iterator = jsonJqgridSearchModel.rules.iterator();
String operation = jsonJqgridSearchModel.groupOp;
if(operation.equals("AND")){
Conjunction conjunction = Restrictions.conjunction();
while(iterator.hasNext()){
conjunction.add(iterator.next().getRestriction());
}
criteria.add(conjunction);
}//conjunctions are for AND operation
else{
Disjunction disjunction = Restrictions.disjunction();
while(iterator.hasNext()){
disjunction.add(iterator.next().getRestriction());
}
criteria.add(disjunction);
}//disjunctions are for OR operations
for(Object o: criteria.list()){
corpRegList.add((CorporateRegistration)o);
}
数字も検索してみましたが、出てくる値は文字列です。基準のcreateAliasを使用しますか?SimpleExpressionを返すときに、dataというプロパティのデータ型を指定できますか?