当前位置: 首页 > 知识库问答 >
问题:

NamedEntityGraph在Spring数据Rest中忽略

郎磊
2023-03-14

我有一个存储库,其findAll方法用@EntityGgraph标记。我正在将生成的SQL打印到日志中,我可以看到当直接在Java中使用时,它会生成正确的连接选择(即myRepo.findAll();)。但是当我通过REST调用它时,这种情况不会发生。我要么得到一个异常,BC。懒加载代理不能序列化,或者如果我添加杰克逊-数据库-hibernate5,我可以看到额外的查询。

我尝试在这里生成最小复制:https://github.com/cptwunderlich/SpringDataRestDemo

我看不到其他查询,也没有例外,因此我怀疑该实体已经在缓存中,但它发出了一个没有联接的select。

这里是代码的摘录(使用lombok生成的getter/setter/etc,为了简洁起见省略了一些样板文件!):

实体:

@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个答案

浦琪
2023-03-14

天啊,我刚刚想通了。我想是一种橡胶鸭子调试的形式。

当我发布这个的时候,我注意到“极限?”第二个查询中的子句。我手动添加了@Query和CountQuery,但没有看到任何变化。然后我明白了——限制的论点是从哪里来的?

这只是一种不同的方法:

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

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

第二个来自分页和排序存储库

 类似资料:
  • 我有两个实体。父母和孩子。 儿童知识库。JAVA 我试图通过标准找到子实体,它应该总是有父实体。 我得到一个例外,它试图在地址表中找到parentObj。 我找到了这个链接,并尝试了Joep给出的解决方案,但出现了相同的错误。 Spring数据JPA JpaSpecificationExecator EntityGgraph 我错过了什么。我无法理解为什么/如何在just Child对象中查找pa

  • Spring Boot 2.0.1.RELEASE项目包含Spring Data JPA和Spring Data REST。似乎忽略了RESTendpoint中的<code>sort</code>参数(但在单元测试中使用相同的存储库方法)。存储库如下: } 实体(已编辑)如下: 当我尝试使用导出的RESTendpoint调用它时,例如: http://localhost:8080/api/v1/o

  • 我试图用jqGrid解决Spring Data Rest的问题,所有的事情都很好,除了我想要将对象全部作为序列化返回,所以在ManyToOne关系中,我现在只得到该对象的链接,而我想要将它序列化。 如您所见,中的accountManager类返回为link,但我希望它也被序列化,以便在JQGrid中显示Name属性。 向Shahbour问好

  • 我们得到了异常:参数值元素[1]与预期类型[java.lang.long(N/A)]不匹配 上面的存储库有什么问题?传递数字ID的正确方法是什么?

  • 问题是,Spring HATEOAS和Spring Data Rest之间有什么区别? 我觉得两者都可以做同样的事情,Spring数据Rest(作为Spring数据的一部分)似乎更有活力。 https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-data-rest 你什么

  • 我遵循一个简单的教程来测试SpringDataREST的行为,用@RestResource注释库。我有一个非常简单的场景:用@RestResource注释的Jpa用户实体和用户存储库 我使用注释配置初始化,并尝试注册RepositoryRestMvcConfiguration,以便可以注册UserRepository。但是我的应用程序没有启动,我有以下例外 我使用sping-hateoas: 0.