【问题标题】:JpaRepository: findBy not work when entity has composed idJpaRepository:当实体已组成 id 时,findBy 不起作用
【发布时间】:2017-04-01 22:55:55
【问题描述】:

在我的 Spring Boot 应用程序中,我有 entity EntA 和 repository EntARepository。

@Entity
@IdClass(EntAId.class)
public class EntA implements Serializable {

  @Id
  private String idA;

  @Id
  private String idB;

  private String name;

  ...
}

public class EntAId implements Serializable {

  private String idA;

  private String idB;
}


public interface RouteRepository  extends JpaRepository<EntA, EntAKey> {

  List<EntA> findByName(String name);

}

我在 EntA 中只有一个 id,一切正常,但我最近添加了 composed id,并且在调用 findByName(String name) 方法时开始得到 NPE。

(我仍然可以毫无问题地调用 save/findOne 方法。)

这是堆栈:

java.lang.NullPointerException: null

at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at com.sun.proxy.$Proxy102.createQuery(Unknown Source) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]

【问题讨论】:

  • 您在EntAId PK 类中覆盖了equals() 和hashcode() 吗?
  • 嗯,我做到了,但错误是一样的。
  • 是否添加了默认的空构造函数?你有字段的getter/setter吗? stackoverflow.com/questions/31816468/…
  • 是的,我有。我切换回简单的 id,我可以毫无问题地调用 findByName。看来复合 id 确实存在问题。

标签: spring spring-boot spring-data-jpa


【解决方案1】:

不确定是否是拼写错误,但您在存储库声明中引用了与您定义的 ID 类不同的 ID 类:

public interface RouteRepository  extends JpaRepository<EntA, EntAKey> 

public class EntAId implements Serializable

但是,您仍然可以调用 save 和 findOne 的事实表明您的问题可能有错字,但您的实际代码没问题。

您确定要向findByName 传递名称吗?您可以在此方法签名上放置一个断点来验证...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2017-02-13
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多