我有一个存储库,它的findAll方法被标记为@EntityGraph。我正在将生成的SQL打印到日志中,我可以看到,当直接在Java (即myRepo.findAll();)中使用时,它会生成正确的连接选择。但当我通过REST将其称为“REST”时,这种情况不会发生。我要么得到例外,公元前。延迟加载代理不能序列化,或者如果我添加jackson-5,我可以看到更多的查询。
我尝试在这里生成一个最小的复制:https://github.com/cptwunderlich/SpringDataRestDemo
我看不到附加的查询,也没有例外,所以我怀疑实体已经在缓存中了,但是它发出一个没有联接的选择。
这里摘录了代码(用lombok生成的getters/setters/等等,为了简洁起见省略了一些样板!):
实体:
@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_.idREST查询:
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 ?发布于 2018-06-04 11:34:11
天哪,我才想出来的。我想是一种橡胶鸭子的调试。
当我发布这篇文章时,我注意到了“限制?”子句在第二个查询中。我手动添加了@Query和countQuery,但没有看到任何变化。然后我明白了-- limit的论点从何而来?
这只是一种不同的方法:
@EntityGraph(attributePaths = {"bar"})
@Override
List<Foo> findAll();
@EntityGraph(attributePaths = {"bar"})
@Override
Page<Foo> findAll(Pageable pageable);第二个来自PagingAndSortingRepository
https://stackoverflow.com/questions/50679356
复制相似问题