关于关联的示例查询

时间:2012-02-16 10:45:48

标签: hibernate query-by-example

你不能在关联上使用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还有其他方法吗?

3 个答案:

答案 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;  
        }