带参数属性的Spring数据JPA查询

Kkk*_*kev 50 spring jpa spring-data spring-data-jpa

声明使用输入参数属性作为查询参数的Spring数据JPA查询的最简单方法是什么?

例如,假设我有一个实体类:

public class Person {
    @Id
    private long id;

    @Column
    private String forename;

    @Column
    private String surname;
}
Run Code Online (Sandbox Code Playgroud)

和另一课:

public class Name {
    private String forename;
    private String surname;

    [constructor and getters]
}
Run Code Online (Sandbox Code Playgroud)

...然后我想编写一个Spring数据存储库,如下所示:

public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname")
    findByName(Name name);
}
Run Code Online (Sandbox Code Playgroud)

...但是Spring数据/ JPA不喜欢我在?1参数上指定属性名称.

什么是最好的选择?}

小智 106

此链接将帮助您:支持SpEL表达式的Spring Data JPA M1.类似的例子是:

@Query("select u from User u where u.firstname = :#{#customer.firstname}")
List<User> findUsersByCustomersFirstname(@Param("customer") Customer customer);
Run Code Online (Sandbox Code Playgroud)

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

  • 这是 spring-data-jpa 1.7.2 + 并且需要 spring 4 (5认同)
  • 我可以确认我有同样的问题,即使是弹簧启动1.4 /弹簧4 /弹簧数据jpa 1.10 - (3认同)

Cur*_*... 20

使用签名定义查询方法,如下所示.

@Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
                             @Param("forename") String firstname);
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看Spring Data JPA参考

  • 这不回答这个问题.关键点是我想使用输入参数的属性作为查询参数,而不是单独的输入参数. (2认同)

JB *_*zet 10

你想要的是不可能的.您必须创建两个参数,并分别绑定它们:

select p from Person p where p.forename = :forename and p.surname = :surname
...
query.setParameter("forename", name.getForename());
query.setParameter("surname", name.getSurname());
Run Code Online (Sandbox Code Playgroud)


Cas*_*asi 6

你可以尝试这样的事情:

public interface PersonRepository extends CrudRepository<Person, Long> {
       @Query("select p from Person AS p"
       + " ,Name AS n"  
       + " where p.forename = n.forename "
       + " and p.surname = n.surname"
       + " and n = :name")
       Set<Person>findByName(@Param("name") Name name);
    }
Run Code Online (Sandbox Code Playgroud)


mme*_*mey 6

您也可以使用接口默认方法解决它:

 @Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
                         @Param("forename") String firstname);

default User findByName(Name name) {
  return findByForenameAndSurname(name.getLastname(), name.getFirstname());
}
Run Code Online (Sandbox Code Playgroud)

当然,您仍然可以公开可见的实际存储库功能......