Как динамически игнорировать ленивые типы в приложении SpringBoot? - PullRequest
0 голосов
/ 18 января 2020

У меня есть класс:

@Entity
@Table(name = "restaurants")
public class Restaurant extends AbstractNamedEntity implements Serializable {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
    private Set<Meal> meals = Collections.emptySet();

    //other fields, getters, setters, constructors
}

Я получаю свои данные с помощью Spring Data:

@Repository
public interface RestaurantRepository extends CrudRepository<Restaurant, Integer> {

}

У меня есть REST-контроллер, который выдает JSON данные:

@RestController
@RequestMapping(value = RestaurantController.REST_URL, produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")
public class RestaurantController {
    static final String REST_URL = "/restaurants";

    @Autowired
    private RestaurantRepository repository;

    @GetMapping("{id}")
    public List<Restaurant> getOne(@PathVariable Integer id) {
        return repository.findById(id);
    }
}

Как не включать эти данные LAZY (набор блюд), чтобы получить их в запросе SQL? Как я знаю, мне нужно написать собственный JacksonObjectMapper, но я не знаю, как это сделать

1 Ответ

3 голосов
/ 18 января 2020

Вы можете использовать аннотацию @JsonIgnore, чтобы игнорировать отображение поля. Затем вы должны сделать это:

@JsonIgnore
@OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
private Set<Meal> meals = Collections.emptySet();

ОБНОВЛЕНО

На основе того, что вы хотите сделать " Динамически игнорировать поле при получении одного или не получения всех"вы можете использовать @NamedEntityGraphs аннотацию, чтобы указать c, к каким полям вы хотите присоединиться, затем, используя @NamedEntityGraph, вы указываете путь и границы для операции поиска или запроса, и вы должны использовать в своем пользовательском Repository @EntityGraph аннотация, позволяющая настроить fetch-graph на основе того, что вы хотите сделать.

Поэтому вы должны добавить следующий код:

@Entity
@Table(name = "restaurants")
@NamedEntityGraphs({
    @NamedEntityGraph(name="Restaurant.allJoins", includeAllAttributes = true),
    @NamedEntityGraph(name="Restaurant.noJoins")
})
public class Restaurant extends AbstractNamedEntity implements Serializable {

}

@Repository
public interface RestaurantRepository extends CrudRepository<Restaurant, Integer> {

    @EntityGraph(value = "Restaurant.allJoins", type = EntityGraphType.FETCH)
    @Override
    List<Restaurant> findAll();

    @EntityGraph(value = "Restaurant.noJoins", type = EntityGraphType.FETCH)
    @Override
    Optional<Restaurant> findById(Integer id);

}
...