Hibernate как игнорировать аннотацию @Where

1

У меня есть объект:

@Entity
@Table(name = "[Usermaster]")
@Where(clause = "isDeleted = 0")
public class User {
//...
}

в каком-то потоке мне нужно игнорировать @Where аннотацию и получить пользователя, даже если isDeleted не равен 0. Как я могу это сделать? (Я использую CRUD-репозитории для запроса)

  • 0
    Я пытался сделать тот же подход. Каково было ваше решение?
  • 0
    Я решил не использовать где ни фильтр. Просто сделал регулярные запросы
Теги:
hibernate

2 ответа

2

Существует динамическая версия настройки @Where, это @Filter. Видеть:

Hibernate имеет возможность предварительно определить критерии фильтра и присоединить эти фильтры как на уровне класса, так и на уровне коллекции. Критерии фильтра позволяют вам определить предложение ограничения, подобное существующему атрибуту "where" доступному для класса и различных элементов коллекции.

Управление @Filter немного сложнее, в двух словах:

  • <filter-def>/@FilterDef требуется для определения фильтра
  • <filter>/@Filter должен быть присвоен классу или набору
  • фильтр должен быть включен на уровне сеанса, например: session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");

Таким образом, это, будучи немного более сложным, обеспечивает именно то, что нам нужно: dynamic @Where чтобы быть @Where/выключенным во время выполнения

  • 0
    @Filter по умолчанию отключен, поэтому для его применения во всей системе мне потребуется добавить код во многих местах. Я ищу прозрачное решение, поэтому я смогу добавить новый код только в тех случаях, когда мне не нужен фильтр
  • 2
    Да, управление @Filter более сложное. С другой стороны, это единственный способ - как @Where оценивать @Where. Т.е. @where - фиксированное отображение. Ни в коем случае как его выключить. Я знаю, что это не такой хороший ответ, как вы хотели ... но, с другой стороны, мой опыт с таким фильтром действительно хорош . При наличии некоторого AOP он включается автоматически для нас ... скажем, в 99% случаев. Если нужно, мы можем отключить это .. и это работает;)
Показать ещё 1 комментарий
1

Старый вопрос, но ответ может быть здесь:

простым решением является использование собственного SQL:

lst = sessionFactory.getCurrentSession().
createSQLQuery("select {entb.*}  from EntityB entb where  is_deleted=1")                            
       .addEntity("entb", EntityB.class)
       .list();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню