Spring 数据中的 NamedEntityGraph 忽略
NamedEntityGraph ignore in Spring Data Rest
我有一个存储库,其 findAll 方法标有 @EntityGraph
。我将生成的 SQL 打印到日志中,我可以看到当直接在 Java 中使用时它会生成正确的连接 select(即 myRepo.findAll();
)。
但是当我通过 REST 调用它时,这不会发生。我要么得到一个例外,公元前。延迟加载代理无法序列化,或者如果我添加 jackson-databind-hibernate5,我可以看到其他查询。
我试着在这里生成一个最小的复制品:https://github.com/cptwunderlich/SpringDataRestDemo
我看不到额外的查询,也没有异常,所以我怀疑实体已经在缓存中,但它发出了一个 select 没有连接。
这里是代码的摘录(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 ?
天哪,我刚刚弄明白了。我想是橡皮鸭调试的一种形式。
当我发帖时,我注意到第二个查询中的 "limit ?" 子句。我手动添加了 @Query 和 countQuery 并没有看到变化。然后我恍然大悟 - limit
的论据从何而来?
只是方法不同:
@EntityGraph(attributePaths = {"bar"})
@Override
List<Foo> findAll();
@EntityGraph(attributePaths = {"bar"})
@Override
Page<Foo> findAll(Pageable pageable);
第二个来自 PagingAndSortingRepository
我有一个存储库,其 findAll 方法标有 @EntityGraph
。我将生成的 SQL 打印到日志中,我可以看到当直接在 Java 中使用时它会生成正确的连接 select(即 myRepo.findAll();
)。
但是当我通过 REST 调用它时,这不会发生。我要么得到一个例外,公元前。延迟加载代理无法序列化,或者如果我添加 jackson-databind-hibernate5,我可以看到其他查询。
我试着在这里生成一个最小的复制品:https://github.com/cptwunderlich/SpringDataRestDemo
我看不到额外的查询,也没有异常,所以我怀疑实体已经在缓存中,但它发出了一个 select 没有连接。
这里是代码的摘录(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 ?
天哪,我刚刚弄明白了。我想是橡皮鸭调试的一种形式。
当我发帖时,我注意到第二个查询中的 "limit ?" 子句。我手动添加了 @Query 和 countQuery 并没有看到变化。然后我恍然大悟 - limit
的论据从何而来?
只是方法不同:
@EntityGraph(attributePaths = {"bar"})
@Override
List<Foo> findAll();
@EntityGraph(attributePaths = {"bar"})
@Override
Page<Foo> findAll(Pageable pageable);
第二个来自 PagingAndSortingRepository