Как использовать List <String>params в Restrictions.like - PullRequest
1 голос
/ 21 февраля 2020

Я использую List объекты в Restrictions.in методах, теперь я должен использовать этот случай в Restrictions.like Но Restrictions.like не получает List param. Как я могу решить эту проблему? Мой код снизу:

public void setPhones(Set<String> phones) {
    this.phones.addAll(phones);
    if (!this.phones.isEmpty()) {
        aliases.add(new QueryAlias("profile", "profile"));
        criterions.add(Restrictions.like("profile.phone", this.phones));
    }
}

1 Ответ

0 голосов
/ 21 февраля 2020

Исправление моего предыдущего (и теперь отредактированного) ответа

В соответствии с документацией (https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/criterion/Restrictions.html) кажется, что у вас нет прямого способа сделать this.

Вы можете попробовать выполнить итерацию своего списка, затем создать список Restriction.like для каждого из ваших телефонов, а затем преобразовать этот список в массив для использования в Ограничения. или :

public void setPhones(Set<String> phones) {

    this.phones.addAll(phones);

    if (!this.phones.isEmpty()) {
        // Creates a list to store criterions
        List<Criterion> criterionsPhoneNumbers = new ArrayList<>();

        // For each number searched, it creates a criterion with a "Like Restriction" adding to criterionsPhoneNumbers List. 
        // Pay attention to match mode (in raw sql it'll be a "like" using %phoneNumber% - check the generated SQL by hibernate).
        // You can change this to suit your needs.
        for (String number : numbers) {
            aliases.add(new QueryAlias("profile", "profile"));
            criterionsPhoneNumbers.add( Restrictions.like("number", number, MatchMode.ANYWHERE)  ) ;
        }

        // Here criterionsPhoneNumbers is being converted to array then added to the criteria with "Or Restriction" 
        criteria.add(Restrictions.or( criterionsPhoneNumbers.toArray(new Criterion[restrictionsPhoneNumbers.size()]) ));
    }


}

Мой предыдущий ответ был неверным, потому что добавления каждого телефонного номера в качестве Restriction.like (only) было недостаточно, и он был преобразован в sql с логическими 'и' в пункте «где». Поскольку я не проверял, я не мог увидеть ошибку. Я реализовал, тогда я увидел ошибку.
Мои извинения.

...