У меня есть репозиторий, метод 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 ?