Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate JPQL зарезервированные слова / 14 сообщений из 14, страница 1 из 1
18.02.2021, 18:06
    #40046819
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Следующий код:
Код: 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
18.02.2021, 19:16
    #40046846
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
faustgreen,
Вы проверили переименовав пакет и ошибка ушла?
...
Рейтинг: 0 / 0
18.02.2021, 19:53
    #40046861
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
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
18.02.2021, 19:57
    #40046863
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Только сейчас заметил, в первом посте запрос и сообщение об ошибке немного не совпадают (лог ошибки взял из другого примера). Но это сути не менят, там все аналогично.
...
Рейтинг: 0 / 0
18.02.2021, 21:55
    #40046904
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Коллизия имен и резервированных слов - обычное дело в SQL. Поэтому и делают SQL-билдеры.

Попробуй закрыть этот by кавычками (" quotes) как делают в 99% SQL или еще есть вариант
- обратный апостроф (`) (как в PrestoDb /BigData).
...
Рейтинг: 0 / 0
18.02.2021, 22:29
    #40046917
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
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
18.02.2021, 22:35
    #40046920
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Во первых не прямой а обратный апостроф. Hex code 0x60.

Во вторых где у тебя там ключевое слово BY (ORDER BY) ?
...
Рейтинг: 0 / 0
18.02.2021, 23:00
    #40046924
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
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
18.02.2021, 23:16
    #40046929
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Ну проверь. Создай таблицу с названием "by" или поле.
...
Рейтинг: 0 / 0
18.02.2021, 23:16
    #40046930
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
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
18.02.2021, 23:31
    #40046936
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Поигрался с именем пакета:
Код: 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
18.02.2021, 23:46
    #40046938
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate JPQL зарезервированные слова
Попробуй пересоздай пакет с именем в кавычках

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

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


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