Эквивалентный JPA-запрос для ЛЮБОГО оператора в psql - PullRequest
0 голосов
/ 08 мая 2019

У меня есть сущность, которая выглядит следующим образом.Я удалил некоторые из полей для упрощения:

@Entity    
public class ObjectMeta implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "inc_id", columnDefinition = "SERIAL")
private Integer id;

@Column(nullable = false, unique = true)
private String name;
    @Column(name = "status", columnDefinition = "verification_status DEFAULT 'PENDING' NOT NULL")
private String status;

@Column(name = "categories", columnDefinition = "character varying (10)[]")
@Type(type = "stringUserType")
private List<String> categories;
@UpdateTimestamp
@Column(name = "modified_on", columnDefinition = "TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL")
@Temporal(TemporalType.TIMESTAMP)
private Date modifiedOn;
@Column(name = "modified_by", columnDefinition = "character varying(100)")
private String modifiedBy;
}

Теперь у меня есть API, который запрашивает эту сущность на основе имени поляified_by ,ified_on.Кроме того, существуют другие поля, в которых есть предикаты, аналогичные предикату, добавленному для имени в приведенном ниже коде.Это упрощенная версия моей текущей функции:

@Transactional
public List<AdomainMeta> getObjects(final String like, final String category) {
    final EntityManager em = getEntityManager();
    final CriteriaBuilder cb = em.getCriteriaBuilder();

    final CriteriaQuery<ObjectMeta> criteriaQuery = cb.createQuery(ObjectMeta.class);

    final Root<ObjectMeta> metaRoot = criteriaQuery.from(ObjectMeta.class);
    final List<Predicate> predicates = new ArrayList<>();
    predicates.add(cb.like(cb.lower(metaRoot.get("name")),like.toLowerCase()));

    criteriaQuery.where(predicates.toArray(new Predicate[] {}));

    final TypedQuery<ObjectMeta> typedQuery = em.createQuery(criteriaQuery);
    return typedQuery.getResultList();
}

Вышеуказанная функция эквивалентна приведенному ниже запросу psql:

select * from object_meta where name like '%like%';

Я просто хочу добавить предикат, чтобы сделать эту функциюэквивалентно следующему psql-запросу:

select * from object_meta where name like '%like%' and 'category' = ANY(categories);

Я попытался найти эквивалент оператора psql ANY в JPA, но не нашел ничего существенного.Любая помощь приветствуется.И есть ли лучший способ добиться этого?

1 Ответ

0 голосов
/ 08 мая 2019

Попробуйте in.

predicates.add(cb.in(cb.parameter(String.class, "cat")));
... // non-empty collection. not array
typedQuery.setParameter("cat", categoryCollection);

В PostgreSQL выражение a IN (b,c,e) внутренне преобразуется в a = ANY(ARRAY[b,c,e]), а a NOT IN (b,c,e) становится a <> ALL (ARRAY[b,c,e]).

Однако, похоже, вы ищете не того оператора. Вы хотите, чтобы он содержал какие-либо из них в параметре или все? Потому что anyarray = ANY(anyarray) не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...