NamedEntityGraph игнорировать в Spring Data Rest - PullRequest
0 голосов
/ 04 июня 2018

У меня есть репозиторий, метод findAll которого отмечен @EntityGraph.Я печатаю сгенерированный SQL в журнал, и я вижу, что он генерирует правильный выбор соединения, когда используется непосредственно в Java (то есть myRepo.findAll();).Но когда я вызываю это через REST, этого не происходит.Я либо получаю исключение, до н.э.прокси с отложенной загрузкой не может быть сериализован, или если я добавлю jackson-databind-hibernate5, я смогу увидеть дополнительные запросы.

Я попытался создать минимальное воспроизведение здесь: https://github.com/cptwunderlich/SpringDataRestDemo

Я не вижу дополнительных запросов и исключений нет, поэтому я подозреваю, что сущность уже находится в кэше, но выдает выбор без объединения.

Вот выдержка из кода(getters / setters / etc. сгенерированные с помощью lombok, некоторые шаблоны для краткости опущены!):

Сущности:

@Entity
@Data
@NoArgsConstructor(force = true)
public class Bar {
  @Id @GeneratedValue
  private Long id;

  private String value;

  @Version
  private Long version;
}

@Entity
@NamedEntityGraph(name = "Foo.full", includeAllAttributes = true)
@Data
@NoArgsConstructor(force = true)
@EqualsAndHashCode(of = {"name"})
public class Foo {
  @Id @GeneratedValue
  private Long id;

  private String name;

  @ManyToOne(fetch = LAZY, cascade = CascadeType.ALL)
  @NonNull
  private Bar bar;

  @Version
  private Long version;
}

Репозиторий:

@RestResource
public interface FooRepository extends JpaRepository<Foo, Long> {

  @EntityGraph(value = "Foo.full", type = EntityGraphType.LOAD)
  @Override
  List<Foo> findAll();
}

Сгенерированный запрос дляfindAll:

select
    foo0_.id as id1_1_0_,
    bar1_.id as id1_0_1_,
    foo0_.bar_id as bar_id4_1_0_,
    foo0_.name as name2_1_0_,
    foo0_.version as version3_1_0_,
    bar1_.value as value2_0_1_,
    bar1_.version as version3_0_1_ 
from
    foo foo0_ 
left outer join
    bar bar1_ 
        on foo0_.bar_id=bar1_.id

Запрос через REST:

select
    foo0_.id as id1_1_,
    foo0_.bar_id as bar_id4_1_,
    foo0_.name as name2_1_,
    foo0_.version as version3_1_ 
from
    foo foo0_ limit ?

1 Ответ

0 голосов
/ 04 июня 2018

О боже, я только что понял это.Полагаю, что это была отладка из резиновой утки.

Когда я писал это, я заметил "предел?"предложение во втором запросе.Я вручную добавил @Query и countQuery и не увидел изменений.Затем меня осенило - откуда взялся аргумент для limit?

Это просто другой метод:

  @EntityGraph(attributePaths = {"bar"})
  @Override
  List<Foo> findAll();

  @EntityGraph(attributePaths = {"bar"})
  @Override
  Page<Foo> findAll(Pageable pageable);

Со вторым из PagingAndSortingRepository

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