我正在使用jqgrid插件的spring MVC 3.0。我正在构建jqgrid的搜索功能,它发送一个json对象到服务器端。我创建了一个虚拟java类来解析jqgrid的json,无论何时触发搜索。所有这一切都很好。hibernate标准查询 - 子属性的属性
我正在动态创建我的标准查询,因为用户可以自由选择搜索条件(等于,不等于,等等)。这里是jqgrid发送的json字符串的一个例子。
{
"groupOp": "AND",
"rules": [{
"field": "company",
"op": "cn",
"data": "School"},
{
"field": "numberOfStudents",
"op": "eq",
"data": "2"}]
}
此OS用作模板来解析此JSON
public class JsonJqgridSearchModel {
public String groupOp;
public ArrayList<JqgridSearchCriteria> rules;
}
通知称为JqgridSearchCriteria类型的Java类,这是它简单地返回一个限制我随时调用其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。
这是事情,我有对象-A其中有对象B作为参考。我从网格上得到的是Object-B.getName()因此有JqgridSearchCriteria
其中field = Object-B.getName()而数据是用户提供的名称。当这个运行我得到一个异常如下:
内部错误 对不起,我们遇到了一个内部错误。 详细 无法获得通过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时,可以指定称为数据的属性的数据类型吗?
请指教。