powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate JPQL зарезервированные слова
14 сообщений из 14, страница 1 из 1
Hibernate JPQL зарезервированные слова
    #40046819
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующий код:
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Person> persons = entityManager.createQuery(
	"select distinct pr1 " +
	"from Person pr1, Person pr2 " +
	"where pr1.id <> pr2.id " +
	"  and pr1.address = pr2.address " +
	"  and pr1.createdOn < pr2.createdOn", Person.class )
.getResultList();


падает с исключением:
Код: java
1.
2.
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: by near line 1, column 83 
[select distinct a, b from by.xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx.Person a, by.xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx.Phone b where b.person = a and b is not null]


Причина здесь:
select distinct a, b from by.xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx.Person a, by .xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx.Phone b

Имя пакета, где лежат энтити, начинается с "by".

Можно ли обойтись без переименования пакета? Есть ли какие экранирующие конструкции?
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046846
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
Вы проверили переименовав пакет и ошибка ушла?
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046861
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, Да, переименовал в bby .xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx - все ок.
Причем, если из запроса убрать вторую энтити, то все отработает норм даже с пакетом
by.xxx.xxxxxxxxxx.xxxxxxx.xxxxxxxxxxxx:
Код: java
1.
2.
3.
4.
5.
List<Person> persons = entityManager.createQuery(
	"select distinct pr1 " +
	"from Person pr1"
        , Person.class )
       .getResultList();
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046863
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только сейчас заметил, в первом посте запрос и сообщение об ошибке немного не совпадают (лог ошибки взял из другого примера). Но это сути не менят, там все аналогично.
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046904
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллизия имен и резервированных слов - обычное дело в SQL. Поэтому и делают SQL-билдеры.

Попробуй закрыть этот by кавычками (" quotes) как делают в 99% SQL или еще есть вариант
- обратный апостроф (`) (как в PrestoDb /BigData).
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046917
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, попробовал прау вариантов с кавычками - не работает, да и не до конца понятно что экранировать.
запрос выглядит так:
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Person> persons = entityManager.createQuery(
	"select distinct pr1 " +
	"from Person pr1, Person pr2 " +
	"where pr1.id <> pr2.id " +
	"  and pr1.address = pr2.address " +
	"  and pr1.createdOn < pr2.createdOn", Person.class )
.getResultList();


А в логе вместо коротких имен классов, полные. Видимо это хибер их внутри преобразует.
Если сделать, что то типо такого
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Person> persons = entityManager.createQuery(
	"select distinct pr1 " +
	"from 'Person' pr1, 'Person' pr2 " +
	"where pr1.id <> pr2.id " +
	"  and pr1.address = pr2.address " +
	"  and pr1.createdOn < pr2.createdOn", Person.class )
.getResultList();


, то получаем unexpected token 'Person'.
Вариант с
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Person> persons = entityManager.createQuery(
	"select distinct pr1 " +
	"from 'by.xxx.xxxxx.Person' pr1, 'by.xxx.xxxxx.Person' pr2 " +
	"where pr1.id <> pr2.id " +
	"  and pr1.address = pr2.address " +
	"  and pr1.createdOn < pr2.createdOn", Person.class )
.getResultList();


тоже не прокатил.

Вообщем, переименовал пока пакет, на будещее учту.
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых не прямой а обратный апостроф. Hex code 0x60.

Во вторых где у тебя там ключевое слово BY (ORDER BY) ?
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046924
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
По первому вопросу:
Код: java
1.
2.
3.
4.
   если использую {"} - unexpected char: '"'
   если использую {`} - unexpected char: '`'
   если использую {'}  - unexpected token 'by.xxx.xxxxxxx.xxxxxxxx.Person' или 
                         unexpected token 'Person', если указывать только краткое имя.


По второму вопросу:
Может "by" отдельно и не зарезервированное поле, но лог ошибки указывает именно на него:
unexpected token: by near line 1, column 83 (начало имени пакета для второй энтити).
Хотя может ошибка и совем не в этом, хз.
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046929
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну проверь. Создай таблицу с названием "by" или поле.
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046930
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: by near line 1, column 84
Код: java
1.
[select distinct pr1 from by.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx.Person pr1, by.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx.Person pr2 where pr1.id <> pr2.id   and pr1.address = pr2.address   and pr1.createdOn < pr2.createdOn]
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046936
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поигрался с именем пакета:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
by.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ошибка.
bby.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ок.
_by.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ок.
where.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ошибка.
group.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ок.
select.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ошибка.
sselect.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ок.
as.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ошибка.
order.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ок.
having.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx - ошибка.



Видимо, что то связано с внутренними алгоритмами парсера sql-строки.
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046938
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй пересоздай пакет с именем в кавычках

Код: java
1.
"by.xxx.xxxxxxxxx.xxxxxx.xxxxxxxx.xxxxxxxxxxxx"
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40046939
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, не понял ....
символ {"} вроде ж нельзя использовать в имени пакета.
А если кавычки добавить в запрос, то unexpected char '"'

Вообщем ладно, пакет переименовал, заработало, ну и ок (проект учебный, так что сойдет).
...
Рейтинг: 0 / 0
Hibernate JPQL зарезервированные слова
    #40048283
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79, пример из официальной доки по хиберу.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate JPQL зарезервированные слова
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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