У меня есть сущность, которая выглядит следующим образом.Я удалил некоторые из полей для упрощения:
@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, но не нашел ничего существенного.Любая помощь приветствуется.И есть ли лучший способ добиться этого?