У меня есть две сущности
@Entity
@Getter
public class EntityA extends BaseEntity {
@OneToMany(cascade = { CascadeType.ALL })
@JoinColumn(name = "a_id")
@Filter(name = "activeFilter", condition = "true = is_active")
private List<EntityB> bs;
private String status;
}
и
@Entity
@Getter
@NoArgsConstructor
public class EntityB extends BaseEntity {
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
@Filter(name = "activeFilter", condition = "true = is_active")
private EntityA a;
}
Оба они основаны на BaseEntity, определенном как:
@FilterDef(name="activeFilter")
@Filter(name="activeFilter", condition="is_active = true")
@MappedSuperclass
@Data
public class BaseEntity {
private boolean isActive;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable=false)
private Long id;
}
Я хочу написать запрос к этим объектам таким образом, что, когда фильтр activeFilter включен, он применяется к обоим объектам.
Я определил репозитории следующим образом:
public interface EntityARepo extends JpaRepository<EntityA, Long> {}
и
public interface EntityBRepo extends JpaRepository<EntityB, Long> {
@Query("SELECT b FROM EntityB b JOIN EntityA a ON a = b.a WHERE a.status = :status")
public List<EntityB> findWithStatus(String status);
}
При тестировании программы для следующего сценария ios генерируются запросы в комментариях. В первом запросе фильтр применяется к EntityA, как и ожидалось. Во втором запросе фильтр по-прежнему применяется к объединенной таблице должным образом. В последнем запросе фильтр применяется только к EntityB, однако я хотел, чтобы он применялся и к EntityA:
Session session = entityManager.unwrap(Session.class);
session.enableFilter("activeFilter");
// Generated Query: select * from entitya entitya0_ where entitya0_.is_active = true
List<EntityA> as = aRepo.findAll();
// Generated Query: select * from entityb bs0_ where true = bs0_.is_active and bs0_.a_id=?
System.out.println(as.get(0).getBs().size());
// Generated Query: select * from entityb entityb0_ inner join entitya entitya1_ on (entitya1_.id=entityb0_.a_id) where entityb0_.is_active = true and entitya1_.status=?
List<EntityB> bs = bRepo.findWithStatus("pending");
Итак, как я могу получить фильтр для всех сущностей в запросе JPA? Ссылка на проект filter_demo