我正在使用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時,可以指定稱爲數據的屬性的數據類型嗎?
請指教。