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
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参考
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)
你可以尝试这样的事情:
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)
您也可以使用接口默认方法解决它:
@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)
当然,您仍然可以公开可见的实际存储库功能......
| 归档时间: |
|
| 查看次数: |
91363 次 |
| 最近记录: |