Hibernate @Filter не работает с методом Spring JpaRepository.findByIdJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Hibernate @Filter не работает с методом Spring JpaRepository.findById

Сообщение Anonymous »

Чтобы создать авторизацию на уровне строк, я хочу использовать аннотации спящего режима @Filter и @FilterDef в сочетании с интерфейсом JpaRepository Spring-данных. Предположим, что у нас есть следующие сущности:

Код: Выделить всё

@Entity
public class User {
@Id
private Long id;
private String name;

@ManyToOne
private Pharmacy pharmacy;
}

@Entity
public class Pharmacy {
@Id
private Long id;
private String name;
}
Я хочу создать авторизацию на основе того, кто отправляет запросы на сервер. Для этой цели я добавил аннотации @Filter и @FilterDef вверху сущности «Аптека». Итак, аптека должна быть такой:

Код: Выделить всё

@Entity
@FilterDef(name = "pharmacyFilter", parameters = {@ParamDef(name = "userId", type = "long")})
@Filters({
@Filter(name = "pharmacyFilter", condition = "id in (select user.pharmacy_id from user where user.id = :userId)")
})
public class Pharmacy {
//...
}
Репозиторий, который я создал для доступа к базе данных, показан ниже:

Код: Выделить всё

@Repository
public interface PharmacyRepository extends JpaRepository {

}
Когда я включаю PharmacyFilter, все работает нормально, и фильтр применяется ко всем запросам. Вы можете увидеть запрос, сгенерированный для репозитория.findAll(), следующим образом:

Код: Выделить всё

select pharmacy0_.id as id1_0_, pharmacy0_.name as name2_0_ from pharmacy pharmacy0_ where pharmacy0_.id in (select user.pharmacy_id from user where user.id = ?)
Но проблема возникла, когда я хочу попробовать использовать репозиторий.findById(ID id). Когда я использую упомянутый метод, фильтр не будет применен к окончательному запросу, и мы увидим в терминале следующий SQL-код:

Код: Выделить всё

select pharmacy0_.id as id1_0_0_, pharmacy0_.name as name2_0_0_ from pharmacy pharmacy0_ where pharmacy0_.id=?
Я думаю, проблема связана с многократным использованием id. Один в findById, а другой в условии фильтра. Но когда я попытался создать запрос с использованием объекта сеанса, этой проблемы не возникло, и вывод желателен:

Код: Выделить всё

select pharmacy0_.id as id1_0_, pharmacy0_.name as name2_0_ from pharmacy pharmacy0_ where pharmacy0_.id in (select user.pharmacy_id from user where user.id = ?) and pharmacy0_.id=2
Проблема решается с помощью следующего подхода, но что происходит, когда мы используем реализацию JpaRepository#findById по умолчанию?

Код: Выделить всё

@Query(value = "from Pharmacy where id = :id")
Optional findById(Long id);
Заранее спасибо.


Подробнее здесь: https://stackoverflow.com/questions/659 ... yid-method
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»