Как добавить условие арендатора в Spring Data JPA Default и Dervied Queries - PullRequest
0 голосов
/ 31 октября 2019

У меня есть приложение Springboot с репозиториями, имеющими Spring Data JPA-запросы, такие как findOne, findAll, а также производные, такие как findByID или findByName и т. Д.

Чего я хочу добиться, так это многопользовательской работы. У всех сущностей есть столбец "account_id", который содержит владельца.

Как добавить фильтр, подобный "account_id", ко всем запросам, перечисленным выше, без использования производных запросов, которые содержат такие имена, как findIdAndAccountid (который будет findone)

@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {

    Category findByName(String name);

}

Вот соответствующая сущность

@Entity
@Table(name = "unit")
@Data
public class Unit {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @Column(name = "account_id")
    private Long account_id;
}

Я знаю, что большинство людей используют схемы в качестве разделения арендаторов, но для меня это невозможно. Есть ли способ (я не нашел один), чтобы добавить такое условие фильтра арендатора на эти запросы без написания NamedQueries или с использованием DerivedQueries. Решение Elegeant, такое как аннотирование хранилища или сущности или, может быть, запросы, к которым все запросы должны добавить дополнительный фильтр "account_id"?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Обновление и решение 1. Создайте Filter & FilterDef для объекта, например,

@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="long" ) )
@Filters( {
        @Filter(name="accountFilter", condition=":accountId = account_id")
} )
public class Category {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @Column(name = "account_id")
    private Long account_id;
}
включить фильтрацию в контроллере с помощью автоматического управления сущностями, написав метод для включения фильтра и активации фильтра в @ModelAttribute для каждого запроса
@RestController
@RequestMapping(path = "/categories",produces = MediaType.APPLICATION_JSON_VALUE )
public class CategoryController {
    private final CategoryRepository repository;

    @Autowired
    private EntityManager entityManager;

    CategoryController(CategoryRepository repository) {
        this.repository = repository;
    }

    private void activateFilter() {
        Session session = entityManager.unwrap(Session.class);

        Filter filter = session.enableFilter("accountFilter");
        filter.setParameter("accountId", Long.valueOf(TenantContext.getCurrentTenant()));


    }
    @ModelAttribute
    public void initFilter() {
        activateFilter();
    }

    ... your rest methods here

}
0 голосов
/ 31 октября 2019

Вы можете добавить условие Where в свои классы Entity (У него не было времени для тестирования)

@Entity
@Table(name = "unit")
@Data
@Where(clause = "account_id= :account_id")
public class Unit {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @Column(name = "account_id")
    private Long account_id;
}

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