我正在使用Spring Data JPA Repositories,并希望根据通过我的方法传递的参数构建自定义WHERE子句
是否可以像这样动态设置我的WHERE子句?
@Query("SELECT U FROM USERS U WHERE U.:columnName = :searchString)
List<User> findUserInfo(
@Param("columnName") String columnName,
@Param("searchString") String searchString);
所以我可以这样调用我的方法:
findUserInfo("company", "Amazon")
它将创建查询:
SELECT U FROM USERS U WHERE U.company = 'Amazon'
和
findUserInfo("address", "123 Billy Graham Drive",)
会创建查询:
SELECT U FROM USERS U WHERE U.address = '123 Billy Graham Drive'
答案 0 :(得分:1)
不,这是不可能的。 JPA将验证查询,并且它无法验证无法知道列名称(或属性名称)的WHERE条件。所以,你做不到。 如果你想做类似的事情你应该使用Criteria,或作为Spring Data JPA一部分的规范。这将允许您以编程方式而不是JPQL查询创建此类动态查询。
答案 1 :(得分:-1)
是的,您可以通过使用扩展QueryDslRepositorySupport的自定义存储库来做到这一点
请考虑以下示例
@Service
Optional<User> findByEmail(String email);
@NoRepositoryBean
public interface UserRepositoryCustom {
Optional<User> findByEmail(String email);
}
@Repository
public class UserRepositoryImpl extends QuerydslRepositorySupport implements UserRepositoryCustom {
public UserRepositoryImpl() {
super(User.class);
}
@Override
public Optional<User> findByEmail(String email) {
JPAQuery<User> query = getQuerydsl()
.createQuery()
.from(QUser.user)
.where(QUser.user.email.equalsIgnoreCase(email))
.select(QUser.user);
return query.fetch().stream().findFirst();
}
}
因此,您可以轻松地将参数传递给JPA查询。