你不能在关联上使用QBE,这是非常令人沮丧的。
我有一个大型数据表,大约有8个多对一列。每个列都有一个下拉列表来过滤表格。
我们假设以下内容:
表用户
User { id, UserStatus, UserAuthorization }
我想使用此代码:
Criteria crit = getSession().createCriteria(class);
crit.add(Example.create(userObject));
这不适用于以下示例userObject
:
User id=1 { UserStatus=Active, UserAuthorization=Admin }
因为QBE不支持集合。
解决此问题的一种方法是以这种方式使用它:
crit.createCriteria("UserStatus").add(Example.create(userStatusObject));
crit.createCriteria("UserAuthorization").add(Example.create(userAuthorizationObject));
我的问题是如何使用给定的User
对象动态编程。除了使用QBE还有其他方法吗?
答案 0 :(得分:2)
您可以将QBE和普通表达式结合起来处理QBE不支持的部分
Criteria crit = getSession().createCriteria(class);
.add(Example.create(userObject));
.add(Expression.eq("UserStatus", userObject.getUserStatus()));
答案 1 :(得分:1)
这是我在我的存储库库中找到的一个通用答案,使用反射:
protected T GetByExample(T example)
{
var c = DetachedCriteria.For<T>().Add(Example.Create(example).ExcludeNone());
var props = typeof (T).GetProperties()
.Where(p => p.PropertyType.GetInterfaces().Contains(typeof(IEntityBase)));
foreach (var pInfo in props)
{
c.Add(Restrictions.Eq(pInfo.Name, pInfo.GetValue(example)));
}
return Query(c);
}
请注意,我的所有实体都继承自IEntityBase,这允许我从对象属性中找到那些外键引用,因此我可以将它们添加到条件中。你必须提供一些方法来执行查询(即c.GetExecutableCriteria(Session))
答案 2 :(得分:0)
以下是可用于每个实体的代码,以便在hibernate中使用查询示例。
/**
* This method will use for query by example with association
* @param exampleInstance the persistent class(T) object
* @param restrictPropertyName the string object contains the field name of the association
* @param restrictPropertyValue the association object
* @return list the persistent class list
*/
public List<T> queryByExampleWithRestriction(T exampleInstance, String restrictPropertyName, Object restrictPropertyValue) {
log.info("Inside queryByExampleWithRestriction method of GenericHibernateDAO");
List<T> list = null;
try {
Criteria criteria = getSession().createCriteria(exampleInstance.getClass());
Example example = Example.create(exampleInstance);
criteria.add(example);
criteria.add(Restrictions.eq(restrictPropertyName, restrictPropertyValue));
list = criteria.list();
log.info("Executed the queryByExampleWithRestriction query with criteria successfully!");
} catch(HibernateException e){
throw (e);
}
finally{
this.closeSession();
}
return list;
}