是否可以将对象传递给自定义存储库查询,并且可以将对象的字段用作SQL内部的参数?我发现的所有示例都将所有参数都列为方法参数。
我正在尝试将upsert逻辑实现为CrudRepository上的自定义查询。我想将Person对象传递给该方法,并使用一些业务标识符来检测冲突和更新,例如:
class Person {
private Integer id;
private String name;
private String email;
// getters & setters removed for brevity
}
不幸的是,由于无法解析参数name
和email
,此操作失败了:
@Repository
public interface PersonRepository extends CrudRepository<Person, Integer> {
@Query(value =
"INSERT INTO person (name, email)" +
"VALUES (:name, :email)" +
"ON CONFLICT (email) DO UPDATE")
Person upsertOnEmail(Person p);
}
对我来说,一种解决方法是使用findFirstByEmail
之类的东西,更新该对象并将其存储(全部存储在事务中),但是更新似乎更有效。