Спящий режим, смешать нагрузку с критериями возможно? - PullRequest
0 голосов
/ 18 мая 2011

можно ли смешать session.load(class, id) с гибкими критериями (критерии api)?

Мне нужно что-то вроде:

select * from entity where id = 1 AND name = 'miller'

Я использую общий подход для поиска по id:

public T findById(ID id, boolean lock) {
    T entity;
    if (lock)
        entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);
    else
        entity = (T) getSession().load(getPersistentClass(), id);

    return entity;
}

и хотел бы расширить это на

    Criteria criteria = session.createCriteria(getPersistentClass());
    criteria.add( Restrictions.eq("name", "miller"));

where ("name", "miller") будет заменено чем-то общим.

1 Ответ

0 голосов
/ 18 мая 2011

Нагрузка и критерии не могут быть смешаны. Load создает прокси, если экземпляр еще не находится в кеше. Цель загрузки (и получения) состоит в том, что его аргументы являются ключами для кэша (класс и идентификатор), и ему не нужно очищать сессию раньше. Критерии - это своего рода запрос. Когда вы уже знаете идентификатор, вам больше не нужен запрос. Я имею в виду, имеет ли id = 1 AND name = 'miller' смысл?


Просто напишите свое собственное "Get":

public TEntity secureGet<TEntity>(int id, string user)
{
  // avoid flushing, only when you never expect that the user name
  // in the object to be loaded has changed within the current session.
  // this is very performance relevant.
  session.flushMode = FlushMode.Never;
  return session
    .createCriteria(typeof(TEntity))
    .add( Restrictions.idEq(id))
    .add( Restrictions.eq("name", user))
    .UniqueResult<TEntity>();
  session.flushMode = FlushMode.Auto;
}

(извините за возможные синтаксические ошибки, я не программист java)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...