Hibernate noob: критерии для выбора не отображенных отношений - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть два класса в отношениях многие ко многим, но только один из них имеет список для другого.

@Entity
public class Product{
  @ManyToMany
  List<Category> categories;
  //...
}

@Entity
public class Category{
  //...
}

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

import static java.util.Collections.singletonList;

List<Product> getProductsByCategory(Category category){
    List<Product> results = getCurrentSession()
                            .createCriteria(Product.class)
                            .add(Restrictions.in("categories", singletonList(category)))
                            .list();
    if (results == null || results.size() <= 0)
        throw new EntityNotFoundException(category + "is empty");
    return results;
}

Конечно, было бы действительно просто, если бы был сопоставлен продуктв категорию, но, конечно, Hibernate позволит вам сделать такой запрос без него.

РЕДАКТИРОВАТЬ:

Возвращает ошибку Oracle

Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 1

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012
Criteria c = session.createCriteria(Product.class, "product");
c.createAlias("product.categories", "category");
c.add(Restrictions.eq("category.id", category.getId());
List<Product> results = c.list();

Примечание: список результатов НИКОГДА не будет нулевым. И его размер НИКОГДА не будет <0. Пустой список - это то, что нужно вернуть, если в категории нет товара. Я бы не бросил исключение в этом случае. </p>

0 голосов
/ 14 февраля 2012
List<Product> results = getCurrentSession().createCriteria(Product.class)
                        .createCriteria("categories")
                            .add(Restrictions.in("id", uniqueIds(categories)))
                        .list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...