Вопрос по – Как запросить сущности по значению их коллекции

7

Я использую jpa, и у меня есть следующая сущность:

@Entity
@Table(name="favorites_folders")
public class FavoritesFolder {

     private static final long serialVersionUID = 1L;

     @Id
     private String id;

     @NotNull
     @Size(min = 1, max = 50)
     public String name;

     @ElementCollection(fetch = FetchType.LAZY)
     @CollectionTable(
        name="favorites_products",
        [email protected](name="folder_id")
        )
     @Column(name="product_id")
     @NotNull
     private Set<String> productsIds = new HashSet<String>();
}

Что я хочу сделать, так это получить наборFavoritesFolder сущности, которые содержат строку "fav-id" в ихproductsIds участник установлен.

Кто-нибудь знает, как это можно сделать в критерии api?

Обновить
Я думаю, что следующий sql должен сработать, но я не уверен, как это сделать либоJPQL илиCriteria API:

select * from favorites_folders join favorites_products on favorites_folders.id = favorites_products.folder_id where favorites_products.product_id = 'favorite-id'

Ваш Ответ

3   ответа
10

который содержит строку «fav-id» в их наборе членов productsIds с использованием критериев api, необходимо сделать следующее:

CriteriaBuilder cb = em.getCriteriaBuilder(); //em is EntityManager
CriteriaQuery<FavoritesFolder> cq = cb.createQuery(FavoritesFolder.class);
Root<FavoritesFolder> root = cq.from(FavoritesFolder.class);

Expression<Collection<String>> productIds = root.get("productsIds");
Predicate containsFavoritedProduct = cb.isMember("favorite-id", productIds);

cq.where(containsFavoritedProduct);

List<FavoritesFolder> favoritesFolders = em.createQuery(cq).getResultList();

Больше информации о Коллекции в запросах JPQL и критериев.

@ dominicbri7 на связанномвопро Я нашел решение. Используйте метод соединения в классе Rootcb.like(from.join("apples").get("color"), textParameter) cirovladimir
Я знаю, что в этой теме мы ссылаемся на идентификаторы, и поэтому они должны быть РАВНЫМИ, чтобы соответствовать, но допустим, у нас естьCollection<String> вместо этого мы можем сделать по существу то же самое, но вместо того, чтобы нужен элемент, чтобы бытьequal, мы могли бы получить МАТЧ с помощьюLIKE ? dominicbri7
1

Просто по-другому, используя IN

@Entity
public class UserCategory implements Serializable {
private static final long    serialVersionUID    = 8261676013650495854L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ElementCollection
private List<String> categoryName;


(...)
}

Затем вы можете написать запрос критерия как

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<UserCategory> q = cb.createQuery(UserCategory.class);
    Root<UserCategory> root = q.from(UserCategory.class);

    Predicate predicate = cb.conjunction();
    Predicate p1 = cb.equal(root.get(UserCategory_.targetSiteType), siteType.getName());
    Predicate p2 = root.get(UserCategory_.categoryName).in(category);
    predicate = cb.and(p1,p2);

    q.where(predicate);

    TypedQuery<UserCategory> tq = entityManager.createQuery(q);
    List<UserCategory> all = tq.getResultList();

    if (all == null || all.size() == 0){
        return null;
    }else if (all.size() > 1){
        throw new Exception("Unexpected result - "+all.size());
    }else{
        return all.get(0);
    }
0

которая работает. Я использую Springboot 1.5.9. У меня нет времени, чтобы определить причину. Я знаю, что такое вложенное свойство игнорировалось при прохождении черезJacksonMappingAwareSortTranslator. Итак, что я сделал, чтобы обойти это, не использовать объект сортировки, созданный резольверами. Вот мой код вKotlin. Без этогоpageable.sort являетсяnull и сортировка не работает. И мой код создаст новыйPageRequest объект с ненулевымsort это работает

    @RequestMapping("/searchAds", method = arrayOf(RequestMethod.POST))
    fun searchAds(
        @RequestBody cmd: AdsSearchCommand,
        pageable: Pageable,
        resourceAssembler: PersistentEntityResourceAssembler,
        sort: String? = null
    ): ResponseEntity<PagedResources<Resource<Ads>>> {
        val page = adsService.searchAds(cmd, pageable.repairSortIfNeeded(sort))
        resourceAssembler as ResourceAssembler<Ads, Resource<Ads>>
        return adsPagedResourcesAssembler.toResource(page, resourceAssembler).toResponseEntity()
    }

    fun Pageable.repairSortIfNeeded(sort: String?): Pageable {
        return if (sort.isNullOrEmpty() || this.sort != null) {
            this
        } else {
            sort as String
            val sa = sort.split(",")
            val direction = if (sa.size > 1) Sort.Direction.valueOf(sa[1]) else Sort.Direction.ASC
            val property = sa[0]
            PageRequest(this.pageNumber, this.pageSize, direction, property)
        }
    }

Похожие вопросы