Могу ли я сослаться на сущность JPA в SpEL, используя метод репозитория pageAll с возможностью поиска - PullRequest
0 голосов
/ 23 января 2020

У меня есть сущность

@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name="component")
@Audited
public class Component implements Serializable {

    private static final long serialVersionUID = 0L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long Id;

    @Version
    private Long version;

    @Builder.Default
    private Boolean activated = true;

    private String name;


    @ManyToOne
    @JoinColumn(referencedColumnName="Id", nullable = true)
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private Organisation organisation;

}

... и интерфейс репозитория:

@Repository
@RepositoryRestResource(exported = false)
public interface ComponentRepository extends JpaRepository<Component, Long>, JpaSpecificationExecutor<Component>, RevisionRepository<Component, Long, Integer> {


     @Query("select c from Component c where 1 = ?#{@authorisation.isInternalUser() or @authorisation.isUserInOrg(#c) ? 1:0}")
      Page<Component> findAll(@Nullable Specification<Component> spec, Pageable pageable);

}

Моя конечная цель - отфильтровать сущности, которые в данный момент вошедшим в систему пользователям не разрешены чтобы увидеть, элегантно. Я думал, что SpEL будет хорошим способом сделать это, но мне не удалось найти способ передать ссылку на сущность 'c' в выражении. Другой альтернативный подход, вероятно, заключается в том, чтобы изменить JPQL на что-то вроде этого?

 @Query("select c from Component c where c.organisation = ?#{ @authorisation.getCurrentUserOrganisation()} or 1 = ?#{@authorisation.isInternalUser() ? 1:0}")

Или, может быть, есть способ напрямую аннотировать сущность с помощью некоторого SpEL?

Я попытался отладить источники Spring и понять, как он работает, но все, что я увидел, было то, что при оценке контекста SpEL ... был доступ только к объекту Pageable и спецификации JPA.

Спасибо заранее!

1 Ответ

0 голосов
/ 23 января 2020

Создайте Specification<Component> spec, которые делают это:

authorisation.isInternalUser() or @authorisation.isUserInOrg(#c) 

И используйте его с

Page<Component> findAll(@Nullable Specification<Component> spec, Pageable pageable);
...