Spring Data JPA中的动态@Query WHERE Cluase

时间:2015-07-02 20:21:31

标签: java spring spring-mvc jpa

我正在使用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'

2 个答案:

答案 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查询。