Объединение всех и сумм с JPA CriteriaBuilder - PullRequest
6 голосов
/ 02 февраля 2012

Я пытаюсь преобразовать собственный запрос SQL, чтобы использовать API критериев в JPA 2.0. Я нашел много примеров API Criteria в Google, но мне очень трудно собрать все части вместе. Я надеюсь, что более опытный человек сможет помочь мне. Собственный запрос выглядит так:

select 
    sum(amount) from firstTable, secondTable 
        where firstTable.id = secondTable.id 
            and amount <> 0 
            and firstTable.id = ?
union all
select 
    sum(amount) from firstTable, thirdTable 
        where firstTable.id = thirdTable.id 
            and amount <> 0 
            and firstTable.id = ?

Исходный набор результатов запроса возвращал список объектов BigDecimal.

Спасибо!

Ответы [ 4 ]

10 голосов
/ 02 февраля 2012

JPA не поддерживает UNION, либо использует собственный запрос SQL, либо выполняет два запроса.

3 голосов
/ 27 августа 2012

Извините, приведенный ниже пример не является объединением, это скорее объединение.

Я бы рассмотрел использование запроса с несколькими корнями.

Вот отрывок из HiberanteРуководство разработчика, код совместим с JPA 2.0.

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

CriteriaQuery query = builder.createQuery();
Root<Person> men = query.from( Person.class );
Root<Person> women = query.from( Person.class );
Predicate menRestriction = builder.and(
        builder.equal( men.get( Person_.gender ), Gender.MALE ),
        builder.equal( men.get( Person_.relationshipStatus ), RelationshipStatus.SINGLE )
);
Predicate womenRestriction = builder.and(
        builder.equal( women.get( Person_.gender ), Gender.FEMALE ),
        builder.equal( women.get( Person_.relationshipStatus ), RelationshipStatus.SINGLE )
);
query.where( builder.and( menRestriction, womenRestriction ) )
1 голос
/ 31 октября 2012

Если вам нужен Union All, тогда две сущности являются кандидатами, чтобы применить наследство к ним в моем уме.

0 голосов
/ 09 декабря 2013

Как отметил Марчин, это возможно с наследованием, по крайней мере, в особых случаях.

Если вы можете сделать так, чтобы запрашиваемые сущности наследовали одно от другого, используя стратегию наследования TABLE_PER_CLASS (предоставляется опционально, возможно в hibernate, но имеет ограничения там)- вы не можете использовать IDENTITY и AUTO), и если поле, присутствующее в запросе, имеет одинаковое имя в обеих сущностях, вы можете объединить обе сущности, запросив родительскую.

Например, если класс сущности Childвыходит из класса сущностей Parent, оба имеют поле "name", запрос будет выглядеть следующим образом:

select p.name из Parent p

Чтобы выбрать только имена родительских сущностей, добавьте условие с TYPE.

выберите p.name из Parent p, где TYPE (p) = Parent

Если изменение сущностей для наследования одного от другого неуместно, вы можете создать специальные (с наследованием, причины) для этого запроса,поскольку можно создать несколько сущностей для одной и той же таблицы.Но вы, вероятно, не найдете это усилие разумным.

...