如何使用变量字符串集进行类似的查询?

时间:2018-04-02 17:12:39

标签: java database spring hibernate

我正在尝试使用变量字符串进行“ like query ”,以便在单个查询中检索 所有包含一组单词的文本,即:

 public long countByTextLike(Set<String> strings) {
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<Long> query = builder.createQuery(Long.class);
        Root<Example> root = query.from(Example.class);


        query.select(builder.count(root.get("id"))).where(
                builder.and(
                        builder.equal(root.get("lang"), "EN")
                )
        );

        //this does not work
        for (String word : strings) {
            query.where(builder.or(builder.like(root.get("text"), word)));
        }

        return manager.createQuery(query).getSingleResult();

    }

不幸的是,这不起作用,因为在每个循环中覆盖了哪里。只使用循环的最后一个单词并且“AND”重写被覆盖。 如何使用可变数量的字符串进行“ like query ”?这不可能吗?

我正在使用spring框架,但我认为问题可以扩展到休眠

1 个答案:

答案 0 :(得分:2)

您可以使用谓词,然后只使用一个where子句

添加它们
public long countByTextLike(Set<String> strings) {
    CriteriaBuilder builder = currentSession().getCriteriaBuilder();
    CriteriaQuery<Long> query = builder.createQuery(Long.class);
    Root<Example> root = query.from(Example.class);

    Predicate[] predicates = new Predicate[strings.size()];

    query.select(builder.count(root.get("id")));

    Predicate langPredicate = builder.equal(root.get("lang"), "EN");

    int cont = 0;
    for (String word : strings) {
        Predicate pred = builder.like(root.get("text"), "%" + word + "%");
        predicates[cont++] = pred;
    }

    Predicate orPredicate = builder.or(predicates);

    Predicate finalPredicate = builder.and(orPredicate, langPredicate);

    return manager.createQuery(query).where(finalPredicate).getSingleResult();

}