我正在使用带有 jqgrid 插件的 spring MVC 3.0。我正在为 jqgrid 构建搜索功能,它将一个 json 对象发送到服务器端。每当触发搜索时,我创建了一个虚拟 java 类来解析 jqgrid 的 json。到目前为止,一切都很好。
我正在动态创建我的条件查询,因为用户可以自由选择搜索条件(相等,不相等,......等)。下面是 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()
这是一个类,只要我调用它的方法,它就会简单地返回一个限制。这是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-A,它有Object-B作为参考。我从网格中得到的是Object-B.getName()因此有一个JqgridSearchCriteria
where field=Object-B.getName()并且数据是用户提供的名称。当它运行时,我得到一个异常如下:
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 的属性的数据类型吗?