LINUX.ORG.RU

left outer join и проблемы с JPQL.

 , jpql


0

1

Есть два стула… т.е. две таблицы.

CREATE TABLE scheme
(
    id integer NOT NULL,
    command character varying(1024),
    CONSTRAINT scheme_pkey PRIMARY KEY (id)
)

и

CREATE TABLE task
(
    id integer NOT NULL,
    scheme_id integer NOT NULL,
    CONSTRAINT task_pkey PRIMARY KEY (id),
    CONSTRAINT task_to_scheme_fk FOREIGN KEY (scheme_id)
        REFERENCES scheme (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        DEFERRABLE
)

К ним есть два JPA-класса.

@Entity
public class Scheme {

    @Id
    @GeneratedValue
    private Integer id;

    @Basic
    private String command;

}

и

@Entity
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne( optional = false )
    @JoinColumn( name = "scheme_id" )
    private Scheme scheme;

}

И мне надо посчитать сколько task у каждой scheme. В том же sql это делается просто:

SELECT scheme.id AS scm, count(task.id) AS cnt
FROM scheme
LEFT OUTER JOIN task on task.scheme_id = scheme.id
GROUP BY scheme.id
ORDER BY cnt ASC, scm ASC;

И вывод:

11	"0"
1	"4"
2	"4"
4	"4"
6	"4"

Вопрос, как сделать тот же запрос на JPQL? Т.к. что-то в лоб повторить запрос не вытанцовывается, все варианты выдают ошибку на этапе компиляции запроса.

★★★★★

Последнее исправление: WatchCat (всего исправлений: 1)

Что-то типа такого должно быть:

select scheme.id, count(task.id) from Scheme scheme
left join scheme.tasks task group by scheme.id
Только тебе надо в Scheme добавить OneToMany связь к Task.

hippi90 ★★★★★
()
Ответ на: комментарий от crutch_master

Ты предлагаешь использовать голый jdbc?
Нет, спасибо, уже натрахался.
Чуть модель поменялась и переписывай кучу кода.
Да ещё и пропустишь где что.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от hippi90

А без этого никак?
Так-то не жалко, просто заводить поле которое будет использоваться только в одном запросе как-то ...

WatchCat ★★★★★
() автор топика
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от WatchCat

Ну попробуй так:

select scheme.id, count(task.id) from Task task
left join task.scheme scheme group by scheme.id

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

hippi90 ★★★★★
()
Ответ на: комментарий от WatchCat

Нет, спасибо, уже натрахался.

С JPA тоже натрахаешься, но в другом месте. Например на (не)ленивой подгрузке сущностей по связям.

Ты предлагаешь использовать голый jdbc?

Ну нет. Обвязку там какую-нибудь приделать сверху. Но я посмотрел на JDBI и не стал. Надо по любому делать модель для таблицы и DTO под задачи, которые будут собираться по табличным моделям.

crutch_master ★★★★★
()

И мне надо посчитать сколько task у каждой scheme. В том же sql это делается просто:

В том же hibernate, это тоже, кстати делается просто. Выбираешь все схемы, перебираешь их в цикле и считаешь длину массива task. Да, он будет делать выборку и заброс на каждую запись в shcema. Причём тут hibernate и hql, если тебе нужен JPQL? Так гибернейт это его реализация и работать всё будет примерно по той же схеме. Ну или он запросит сразу всё и распихает по сущностням сожрав всю память в жадном режиме. Подумай еще раз, нужен ли тебе этот геморрой, может просто лучше что-то придумать с sql портяночками? Какой-нибудь там генератор, трекер, чтобы знать, что тебе менять надо и т.п.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

Обвязку там какую-нибудь приделать сверху

Т.е. писать по сути самому свой hybernate, ловить и вычищать глюки, познать кучу «радости» и пролюбить задачу.

Не, уж лучше я JPA возьму.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от hippi90

Ну попробуй так:

Не подходит, я пробовал. В таком случае пропускаются scheme без task и первая строчка 11 "0" не выводится.

Но в общем добавление связи всё решило. Спасибо.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

Т.е. писать по сути самому свой hybernate

Неее, не hybirnate и вообще не jpa. Jpa и sql - это 2 стула.

Не, уж лучше я JPA возьму.

Ну возьми. Я сейчас переписываю всё с jpa/hibernate потому что выясняется, что если эта срань сложнее бложика, то её поддерживать и развивать не очень приятно. Совсем не приятно. Особенно оптимизировать там что-то на уровне sql.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

Я сейчас переписываю всё с jpa/hibernate потому что выясняется, что если эта срань сложнее бложика, то её поддерживать и развивать не очень приятно.

По твоим постам уже давно понятно, что у тебя просто руки из жопы.

hippi90 ★★★★★
()
Ответ на: комментарий от hippi90

Да он прав, в целом. В hibernate и jpa замучаешься оптимизировать запросы. Правда, голый jdbc мне тоже не очень нравится.

turtle_bazon ★★★★★
()
Ответ на: комментарий от WatchCat

Т.е. писать по сути самому свой hybernate, ловить и вычищать глюки, познать кучу «радости» и пролюбить задачу.
Не, уж лучше я JPA возьму.

То есть глюки в JPA тебе больше нравятся? А ещё то, что у каждой реализации JPA свои глюки. И один краше другого. :)

turtle_bazon ★★★★★
()
Ответ на: комментарий от hippi90

В целом может и прав, а в частностях такую пургу несет.

Например?

crutch_master ★★★★★
()
Ответ на: комментарий от hippi90

По твоим постам уже давно понятно, что у тебя просто руки из жопы.

Это и по нику сразу понятно. И чего такого в том, что я не имею иллюзий относительно своих возможностей?

crutch_master ★★★★★
()
Ответ на: комментарий от turtle_bazon

Так это про любую реализацию открытых api можно сказать.
Это же не значит, что надо выкинуть всё и начать придумывать свои велосипеды.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Всё или не всё, какая в ж разница?
Я спросил вполне конкретный вопрос и получил объективно рабочий ответ на него.
Но как на ЛОРе это принято прибежало кучу теоретиков и начало убеждать что 'А' плохо, а 'Б' лучше, потому что 'Б' не 'А'.
Дало мне это что-нибудь? Нет, потому что кроме своих «ценных мнений» они ничего не привели.

Если честно, то послать всех скопом на три весёлых буквы мне мешает только правила форума.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

В sql2o - всё просто, ты результат запроса рассовываешь по объектам. И ничего лишнего. То есть то, что ты и так вручную будешь делать. И запросы пишешь какие нужно.

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon

1. JPA - стандарт.
2. Этот стандарт поддерживается сообществом и Ораклом.
3. Я знаю как минимум 3 реализации этого стандарта, т.е. мне есть из чего выбирать.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от turtle_bazon

В JPA мне ничего не надо рассовывать.
За исключением очень редких случаев.

Но это всё бла-бла-бла и трёп ниочём.
Потому что мне нахрен эти твои велосипеды не нужны.
Я о них не спрашивал.
И более того, я не искал «а что же мне выбрать».
Я спросил вполне конкретный вопрос и только один человек на него конкретно ответил.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

В JPA мне ничего не надо рассовывать.
За исключением очень редких случаев.

Прям классическое Ха. Три раза. Тоже по классике.

Потому что мне нахрен эти твои велосипеды не нужны.

Да ты не поверишь и будешь сильно удивлён, конечно, постарайся не воспринимать это для себя как большой сюрприз, но мне абсолютно всё равно что там тебе нужно а что нет. Я показал свой опыт использования и к чему пришёл в итоге. Ничего не навязываю. Нравится JPA - да пользуйся на здоровье. И да, это не мои велосипеды. Да и не велосипеды это, а вполне рабочие инструменты. А сам JPA не интересен. Что-то может из себя представлять только в связке с JTA. Да и то тоже так себе.

Я спросил вполне конкретный вопрос и только один человек на него конкретно ответил.

Перефразируя одного политика: «Надо понимать куда ты с вопросом обращаешься».

turtle_bazon ★★★★★
()
Ответ на: комментарий от WatchCat

1. JPA - стандарт.

Ну и кто его стандартизировал?

2. Этот стандарт поддерживается сообществом и Ораклом.

Стандарт этот сообществом поддерживается чуть более, чем никак. А Оаркл не сегодня, так завтра тебя кинет, как Эклипс недавно кинул.

3. Я знаю как минимум 3 реализации этого стандарта, т.е. мне есть из чего выбирать.

Если тебе вдруг интересно, то я знаю несколько поболее реализаций этого стандарта. И как минимум одну реализацию, в которой этого стандарта не хватает и они делают кучу вещей помимо этого стандарта. Причём каждая реализация работает плохо. Хотя, есть вариант о том, что работает хорошо, но тогда от своей кучи хотелок нужно отказаться. Нафиг мне такое счастье. Наелся в своё время этого. Хватит.

turtle_bazon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.