Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Java Persistence Query Language(JPQL) && NetBeans Database Application

34K
28 мая 2008 года
igla
7 / / 07.03.2008
Посмотрел пример работы с базами данных, предложенный в Netbeans 6 при помощи интерфейсов из javax.persistence и Bean-компонентов на таблицу. Всё конечно замечательно: JTable на Read/Write для одной таблицы базы он создаёт. Но у любой БД, находящейся хоть в какой-то нормальной форме, предоставлять view обычно имеет смысл как минимум для двух связанных таблиц. Вот тут уже возникли явные проблемы.

Проблемма1: Правильно задать запрос используя JPQL.
[INDENT]Если запрос простой ( SELECT что-то FROM таблицы WHERE условие), то всё работает, главное помнить, что используем не имена из базы, а имена из классов созданных под записи для нужных вам таблиц БД, т.е. таблицы - это имена классов помеченных как @Entity, а имена столбцов соответствуют именам переменных данных класов с аннотацией @Column, ну и правильно запрашивать результаты (См. второй пример.)
Если же использовать в запросе, что-то специфичное, мой первый запрос содержал LEFT JOIN, то надо разбираться как писать. Смотрел JPQL Joins. Надо сказать предоставленный там пример меня не шибко вдохновил и построить простейший, например MуSQL запрос (да и других СУБД) вроде
 
Код:
SELECT p.a,p.b,s.s FROM p LEFT JOIN s ON p.s_id=s.is
на JPQL у меня не получилось. [/INDENT]
Проблемма2: Связать List содержащий в каждой записи данные о нескольких сущностях с JTable.
[INDENT]Тут у меня сразу возник вопрос: может быть надо создавать @Entity от нескольких таблиц, тогда работа с JTableBinding нисколько не измениться. Но не похоже что оно делается так и видимо прийдётся думать как создать ColumnBinding, когда в результате запроса каждая строка является массивом сущностей. Если элемент листа является сущностью таблицы БД, то генериться такой код: [highlight=java] org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${propertyName}"));[/highlight]
Попытался через this. Ошибки не выдаёт, но всегда возвращает null, т.е. найти так он не может: [highlight=java] columnBinding = jTableBinding.addColumnBinding(ELProperty.create("${this[0].propertyName}"));[/highlight] [/INDENT]
Проблемы начального этапа обозначил, если решаться, то можно будет пробывать что-то писать и думать хорошо оно или плохо :).
63
28 мая 2008 года
Zorkus
2.6K / / 04.11.2006
1 - Пример с одной табличкой, которая читает и пишет данную, используя
JPA - это только пример, на самом деле там делать не надо :)
2 - Joins в JPQL есть. Вот - http://java.sun.com/javaee/5/docs/tutorial/doc/bnbtl.html#bnbtq.
Подробней можно узнать в документации по API.
Кроме того - JPQL не связан напрямую с Swing Application FrameWork,
в котором используются эти магические обновляющиеся таблички :)
Так что, сначала лучше разберись с ним в консольном приложении.
34K
30 мая 2008 года
igla
7 / / 07.03.2008
Поразбирался в примере с JOIN. Как уже говорил, он меня не сильно вдохновил. Посмотрел хелпу на метаданные и попробывал создать в сущности People внешний ключ на сущность SocStatus:
[highlight=java] @ManyToOne(optional = false)
@JoinColumn(name = "pk_status", nullable = true, referencedColumnName = "pk_status")
private SocStatus socStatus;//собственно переменная объекта внешней
//таблицы по pk_status

public SocStatus getSocStatus() {
return socStatus;
} [/highlight]

Он это проглатил. Далее как в примере создаю Querry со следующим запросом:
 
Код:
SELECT p FROM People p LEFT JOIN p.socStatus st

Запрос создаёться без багов.
При получении ResultSet выдаёт следующее:
 
Код:
Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 't0.PKSTATUS' in 'field list'
Error Code: 1054
Call: SELECT t0.pk_people, t0.phone, t0.adress, t0.name, t0.PKSTATUS, t0.family, t0.pk_status FROM people t0 LEFT OUTER JOIN soc_status t1 ON (t1.pk_status = t0.pk_status)

Зачем он запрашивает этот PKSTATUS, чёрт его знает. Ни в коде, ни в xml-ках проекта, ни тем более в базе его нет. Запрос
 
Код:
SELECT t0.pk_people, t0.phone, t0.adress, t0.name, t0.family, t0.pk_status FROM people t0 LEFT OUTER JOIN soc_status t1 ON (t1.pk_status = t0.pk_status)

был бы верным. Если от этого избавиться, конечно возникает ещё куча проблем, например не знаю как лучше инициализировать socStatus, но пока запрос нормально генерить не будет тут не посмотришь и ничего не проверишь.
34K
02 июня 2008 года
igla
7 / / 07.03.2008
Нормально работает, внешние ключи, которые Netbeans по умолчанию для сущностей создаёт удаляешь, а потом создаёшь ссылки на внешние таблице как показано выше.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог