Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в EJBQL/JPA подсунуть под JOIN условие проверки на null? / 11 сообщений из 11, страница 1 из 1
02.10.2012, 12:51:01
    #37980002
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Когда генерируется запрос из EJBQL/JPA, то условие JOIN что-то ON [условие] берётся из сущности - из аннотаций какого-то поля сущности.
Допустим у меня есть 4 сущности:
Schet, Sluch, Usl и Error.

Error:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    @JoinColumns({
        @JoinColumn(name = "ID_PAK", referencedColumnName = "ID_PAK", nullable = false, insertable = false, updatable = false),
        @JoinColumn(name = "ID_SLUCH", referencedColumnName = "ID_SLUCH", insertable = false, updatable = false),
        @JoinColumn(name = "ID_USL", referencedColumnName = "ID_USL")})
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Usl usl;
    @JoinColumns({
        @JoinColumn(name = "ID_PAK", referencedColumnName = "ID_PAK", nullable = false, insertable = false, updatable = false),
        @JoinColumn(name = "ID_SLUCH", referencedColumnName = "ID_SLUCH")})
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Sluch sluch;
    @JoinColumn(name = "ID_PAK", referencedColumnName = "ID_PAK", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Schet idPak;



Usl:
Код: sql
1.
2.
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usl", fetch = FetchType.LAZY)
    private List<Error> errorList;



Sluch:
Код: sql
1.
2.
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "sluch", fetch = FetchType.LAZY)
    private List<Error> errorList;



Schet:
Код: sql
1.
2.
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPak", fetch = FetchType.LAZY)
    private List<Error> errorList;



В результате такой записи на EJBQL:
Код: sql
1.
2.
3.
4.
5.
6.
                    + " FROM Schet schet"
                    + " LEFT OUTER JOIN schet.errorList scheterror"
                    + " LEFT OUTER JOIN schet.sluchList sluch"
                    + " LEFT OUTER JOIN sluch.errorList slucherror"
                    + " LEFT OUTER JOIN sluch.uslList usl"
                    + " LEFT OUTER JOIN usl.errorList uslerror"


У меня генерируется вот такая часть кода:
Код: sql
1.
2.
3.
4.
5.
6.
FROM MEDFIN.SCHET t0 
LEFT OUTER JOIN MEDFIN.ERROR t1 ON (t1.ID_PAK = t0.ID_PAK)
LEFT OUTER JOIN MEDFIN.SLUCH t2 ON (t2.ID_PAK = t0.ID_PAK)
LEFT OUTER JOIN MEDFIN.ERROR t3 ON ((t3.ID_PAK = t2.ID_PAK) AND (t3.ID_SLUCH = t2.ID_SLUCH)) 
LEFT OUTER JOIN MEDFIN.USL t4 ON ((t4.ID_PAK = t2.ID_PAK) AND (t4.ID_SLUCH = t2.ID_SLUCH))
LEFT OUTER JOIN MEDFIN.ERROR t5 ON ((t5.ID_PAK = t4.ID_PAK) AND ((t5.ID_USL = t4.ID_USL) AND (t5.ID_SLUCH = t4.ID_SLUCH))) 


А надо чтобы генерировалось вот так (с условиями на NULL):
Код: sql
1.
2.
3.
4.
5.
6.
FROM MEDFIN.SCHET t0 
LEFT OUTER JOIN MEDFIN.ERROR t1 ON ((t1.ID_PAK = t0.ID_PAK) AND (t1.ID_SLUCH is null) AND (t1.ID_USL is null))
LEFT OUTER JOIN MEDFIN.SLUCH t2 ON (t2.ID_PAK = t0.ID_PAK)
LEFT OUTER JOIN MEDFIN.ERROR t3 ON ((t3.ID_PAK = t2.ID_PAK) AND (t3.ID_SLUCH = t2.ID_SLUCH) AND (t3.ID_SLUCH is null)) 
LEFT OUTER JOIN MEDFIN.USL t4 ON ((t4.ID_PAK = t2.ID_PAK) AND (t4.ID_SLUCH = t2.ID_SLUCH))
LEFT OUTER JOIN MEDFIN.ERROR t5 ON ((t5.ID_PAK = t4.ID_PAK) AND ((t5.ID_USL = t4.ID_USL) AND (t5.ID_SLUCH = t4.ID_SLUCH))) 


Если этого не делать, то такой запрос вешает Oracle так, что не хватает ресурсов сервера.

Как это сделать?
Или через EJBQL/JPA это невозможно сделать?
В NativeQuery оно конечно будет работать, но не хотелось бы его применять. Лучше, если через EJBQL.
Или разбивать табличку Error на 3 и делать что-то типа:
SchetError, SluchError и UslError. Но это не просто.
...
Рейтинг: 0 / 0
02.10.2012, 13:03:34
    #37980036
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Никто не знает?
Вот и я что-то про это нигде не встречал никакой информации...
...
Рейтинг: 0 / 0
02.10.2012, 13:16:05
    #37980075
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
В JPA 2.1 вроде должно быть:
http://wiki.eclipse.org/EclipseLink/DesignDocs/367452
...
Рейтинг: 0 / 0
02.10.2012, 14:23:47
    #37980211
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Хорошо бы, если так. Надо попробовать. И ещё неплохо было бы под join trim подсовывать, если есть необходимость join'ить по varchar2.
...
Рейтинг: 0 / 0
02.10.2012, 14:25:53
    #37980214
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Но разве он уже вышел?
Недавно скачивал hibernate - а там hibernate-jpa-2.0-api-1.0.1.Final.jar. Название, по-моему, само за себя говорит, что это не JPA 2.1.
...
Рейтинг: 0 / 0
02.10.2012, 14:31:18
    #37980224
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Niky4000Но разве он уже вышел?
Весной, вроде, выйдет.

Niky4000Недавно скачивал hibernate - а там hibernate-jpa-2.0-api-1.0.1.Final.jar. Название, по-моему, само за себя говорит, что это не JPA 2.1.
Hibernate может напрямую заюзать? В HQL и Criteria API уже должно быть.
...
Рейтинг: 0 / 0
02.10.2012, 15:15:14
    #37980357
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
авторHibernate может напрямую заюзать?
Не совсем понял... Что на прямую?
авторВ HQL и Criteria API уже должно быть.
Criteria API - это то что под where? Или Criteria API hibernate'а может как-то условие или trim под join подсунуть? Нигде пока такое не видел.

Короче, до весны это пока решить невозможно. Правильный вывод?
...
Рейтинг: 0 / 0
02.10.2012, 15:19:49
    #37980368
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Наверное, пока весна не наступила лучше избегать такого рода изврата, когда в одной таблице хранится несколько объектов таким образом: если все поля не null, то это 1 объект, а если 1 null, то это другой, а если 2 поля null, то это 3-й объект.
...
Рейтинг: 0 / 0
02.10.2012, 15:24:40
    #37980378
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Niky4000Наверное, пока весна не наступила лучше избегать такого рода изврата, когда в одной таблице хранится несколько объектов таким образом: если все поля не null, то это 1 объект, а если 1 null, то это другой, а если 2 поля null, то это 3-й объект.
Сделайте вычислимую колонку из этих трех, которая потом будет discriminator-ом в маппинге. В зависимости от её значения ORM будет инстанциировать один из 3х классов.
...
Рейтинг: 0 / 0
02.10.2012, 15:25:56
    #37980382
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Niky4000Наверное, пока весна не наступила...
Это уже вам выбирать. Если релиз через, год, то можно взять JEE 7 EA какой-нить и на нем пробовать. Если релиз весной, то наверное, да. Стоит повременить. А HQL нельзя вместо JPQL использовать, если провайдер и так хибер?
...
Рейтинг: 0 / 0
02.10.2012, 15:36:08
    #37980400
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в EJBQL/JPA подсунуть под JOIN условие проверки на null?
Я, наверное, лучше разобью эту таблицу на 3 и сделаю с каждой из них join. Правда понадобится допилить код, который работал с этой таблицей.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в EJBQL/JPA подсунуть под JOIN условие проверки на null? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]