【问题标题】:Dynamic @Query WHERE Cluase in Spring Data JPASpring Data JPA中的动态@Query WHERE子句
【发布时间】:2015-09-20 12:53:29
【问题描述】:

我正在使用 Spring Data JPA 存储库,并希望根据通过我的方法传递的参数构建自定义 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'

【问题讨论】:

  • EAV 回来咬你诶……

标签: java spring spring-mvc jpa


【解决方案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 查询。

【讨论】:

    【解决方案2】:

    不,这是不可能的。 JPA 将验证查询,并且它无法验证无法知道列名(或属性名)的 WHERE 条件。所以,你不能。 如果你想做类似的事情,你应该使用 Criteria 或 Specification,它是 Spring Data JPA 的一部分。这将允许您以编程方式而不是 JPQL 查询来创建此类动态查询。

    【讨论】:

    • 到目前为止,我已经研究了 Criteria、Specification 和 QueryDSL,它们都支持构建动态查询,但是我还没有找到动态搜索列的解决方案
    • Kurai,您找到任何满足您要求的解决方案了吗?
    • @KuraiBankusu 我展示的方式不能满足你的目的吗?
    猜你喜欢
    • 2016-11-26
    • 2020-06-19
    • 2021-12-24
    • 2016-04-29
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2014-02-24
    相关资源
    最近更新 更多