Как включить фильтр гибернации для всех сущностей в запросе JPA - PullRequest
0 голосов
/ 26 мая 2020

У меня есть две сущности

@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

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