【问题标题】:Spring Data JPA/Boot: findBy ... orSpring Data JPA/Boot:findBy ... 或
【发布时间】:2017-02-22 18:06:22
【问题描述】:

我想在我的存储库中编写一个查找器方法,以根据一个字段或另一个字段查找对象,同时提供一个参数,例如:

@RepositoryDefinition(domainClass = Person.class, idClass = Long.class)
public interface PersonRepository extends CrudRepository<Person, Long> {

    List<Person> findAllByIdOrAnotherId(someId);
}

不使用 SQL 怎么办?

【问题讨论】:

  • 您可以将您的方法注释为@Query("from Person p where p.id = ?1 or p.anotherId = ?1")

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


【解决方案1】:

我在方法中添加了第二个参数,它起作用了。

List<Transaction> findAllByIdOrParentId(Long id, Long parentId);

这只是方法的定义,因为我从服务向方法传递了相同的参数:

List<Transaction> transactions = transactionRepository.findAllByIdOrParentId(transactionId, transactionId);

【讨论】:

    【解决方案2】:

    Spring Data JPA 的一个很酷的地方是您可以在接口中将自定义查询定义为抽象方法。

    简而言之,您可以通过指定要查询的@Entity 字段名称来定义新的搜索条件。所以,假设我想通过IdCustomIdfindAll()IdCustomId 都是我的域类中的字段。我会这样做:

    List<Person> findAllByIdOrCustomId(someId, someCustomId);
    

    欲了解更多信息,请研究以下链接: Spring Data JPA - DEFINE QUERY METHODS

    【讨论】:

    • 我已经尝试过了,但应用程序甚至没有启动。这是堆栈跟踪:pastebin.com/TLaWLAer
    • 我在公司防火墙下,所以无法打开并查看此链接 atm
    • 请有空的时候看看,然后回复我。谢谢
    • 根据您的异常日志,问题是在创建transactionRepository 的bean 时由TransactionService 类引起的。我认为您应该尝试对 transactionRepository bean 进行 setter 注入,而不是构造函数注入
    • 这是错误的,应用程序崩溃并显示明确的异常消息:没有可用于部分 CustomId SIMPLE_PROPERTY (1) 的参数:[Is, Equals] NEVER。换句话说,您必须提供第二个参数,不能对 Id 和 CustomId 使用相同的参数。
    猜你喜欢
    • 2017-07-30
    • 2016-12-10
    • 2021-03-25
    • 2017-07-17
    • 1970-01-01
    • 2017-11-29
    • 2020-06-16
    • 2020-01-27
    • 2019-05-17
    相关资源
    最近更新 更多