Java Persistence Query Language(JPQL) && NetBeans Database Application
Проблемма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
Проблемма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]
Проблемы начального этапа обозначил, если решаться, то можно будет пробывать что-то писать и думать хорошо оно или плохо :).
JPA - это только пример, на самом деле там делать не надо :)
2 - Joins в JPQL есть. Вот - http://java.sun.com/javaee/5/docs/tutorial/doc/bnbtl.html#bnbtq.
Подробней можно узнать в документации по API.
Кроме того - JPQL не связан напрямую с Swing Application FrameWork,
в котором используются эти магические обновляющиеся таблички :)
Так что, сначала лучше разберись с ним в консольном приложении.
[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)
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, но пока запрос нормально генерить не будет тут не посмотришь и ничего не проверишь.
Нормально работает, внешние ключи, которые Netbeans по умолчанию для сущностей создаёт удаляешь, а потом создаёшь ссылки на внешние таблице как показано выше.