Запрос примера на ассоциации - PullRequest
5 голосов
/ 16 февраля 2012

Очень неприятно, что вы не можете использовать 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 ]

2 голосов
/ 16 февраля 2012

вы можете комбинировать QBE и обычные выражения для обработки частей, которые QBE не поддерживает

Criteria crit = getSession().createCriteria(class);
    .add(Example.create(userObject));
    .add(Expression.eq("UserStatus", userObject.getUserStatus()));
1 голос
/ 11 марта 2015

Вот общий ответ, который я нашел сработавшим для меня внутри своей базы репозитория, используя отражение:

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))

0 голосов
/ 10 декабря 2016

Вот код, который можно использовать для каждой сущности для использования запроса на примере в режиме гибернации.

  /**
                 * 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;  
        }
...