2015-06-04 3 views
0

Я использую JPA (с спящим режимом под капотом) и хочу выделить группу данных, которая суммирует набор реальных объектов, так, например, имя, имя родительского объекта и количество экземпляров с таким именем.JPA Сводная сущность или метаобъект

В моем полном вымышленном примере дается объект, называемый Ticket, который имеет родительский объект с именем Category, который сам имеет родительский объект под названием MetaCategory.

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

Я мог бы просто выбрать все билеты и засунуть их в хэшсет, под ключ по категории, но это выглядит довольно неэффективно. То, что я в идеале хотел бы сделать, это выбрать список совершенно нового объекта, который не поддерживается какой-либо таблицей базы данных, но содержит метаконкурс, категорию и целое число счетчиков ...

Возможно ли использование JPA, с использованием CriteriaBuilder? Нужно ли просто выбирать вещи вручную?

ответ

2

Если вам абсолютно необходимо использовать критерии запросы, вы можете сделать это с помощью Критерии Конструкторов и элементы выбора см CriteriaQuer#multiSelect

Вы должны использовать выбрать конкретные столбцы, которые вы заинтересованы в и получить кортеж или Объектный массив возвращается из запроса.

Например, с кортежем было бы что-то подобное (не проверено на всех):

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Tuple> query = cb.createQuery(Integer.class); 

Root<Category> r = query.from(Category.class); 
Join<Category, Ticket> jT = r.join("tickets") 
query.multiselect 
(
cb.construct(A.class, root.get("property1"), root.get("property2"), 
cb.construct(Ticket.class, jT.get("...")) 
); 
List<Tuple> result = query.getResultList(); 
0

С помощью Hibernate вы можете создать представление базы данных или подзапрос. Вид будет рассматриваться так же, как таблица. Для определения подвыбора с помощью annotaions, попробуйте следующее:

@Entity 
@Subselect("select item.name, max(bid.amount), count(*) " 
    + "from item " 
    + "join bid on bid.item_id = item.id " 
    + "group by item.name") 
@Synchronize({"item", "bid"}) //tables impacted 
public class Summary { 
    @Id 
    public String getId() { return id; } 
    ... 
} 

Как взято из docs.

Смежные вопросы