powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA NamedQuery
21 сообщений из 21, страница 1 из 1
JPA NamedQuery
    #39190581
ditban
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, очень нужна ваша помощь. Никак не пойму, что именно не так((
Запрос на сущности:
@NamedNativeQuery(name = "Meetings.findByDay", query = "select * from meetings where DATE(start_time ) = :date", resultClass = Meetings.class)

и далее его использую:
Query query= em.createNamedQuery("Meetings.findByDay");
query.setParameter("date", "2016-02-27");

Ошибка:
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':date' at line 1
Error Code: 1064
Call: select * from meetings where DATE(start_time ) = :date
Query: ReadAllQuery(name="Meetings.findByDay" referenceClass=Meetings sql="select * from meetings where DATE(start_time ) = :date")
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)

При этом если делаю этот запрос без параметра, то все проходит:
@NamedNativeQuery(name = "Meetings.findByDay", query = "select * from meetings where DATE(start_time ) = '2016-02-27'", resultClass = Meetings.class)
Query query= em.createNamedQuery("Meetings.findByDay");
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39190586
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно EclipseLink не поддерживает именованных параметров для @NamedNativeQuery?
Попробуйте

Код: java
1.
2.
3.
4.
@NamedNativeQuery(name = "Meetings.findByDay", query = "select * from meetings where DATE(start_time ) = ?", resultClass = Meetings.class)

Query query= em.createNamedQuery("Meetings.findByDay");
query.setParameter(1, "2016-02-27");
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39190775
ditban
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, к сожалению, не подошло(

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':date' at line 1
Error Code: 1064
Call: select * from meetings where DATE(start_time ) =:date
Query: ReadAllQuery(name="Meetings.findByDay" referenceClass=Meetings sql="select * from meetings where DATE(start_time ) =:date")
at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:382)
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39190786
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ditbanBlazkowicz, к сожалению, не подошло(

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':date' at line 1
Error Code: 1064
Call: select * from meetings where DATE(start_time ) =:date
Query: ReadAllQuery(name="Meetings.findByDay" referenceClass=Meetings sql="select * from meetings where DATE(start_time ) =:date")
at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:382)
Замени название параметра с date на myDate, например. Может поможет.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39190789
Фотография Zenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ditban,

В eclipselink у параметра вместо двоеточия, вопросик должен быть.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39191098
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ditban,

В EclipseLink для именованного параметра в NamedNativeQuery надо использовать #, т.е. DATE(start_time ) = #date.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39192333
ditban
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD,

да, прошло с #date! Спасибо!
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39194795
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не стал создать новую тему, и если позволите задам свой вопрос тут... :)
собственно вопрос:
есть
Код: java
1.
@NamedQuery(name = "Abonent.findByFIO", query = "select a from Abonent a where  a.firstName like '%:x%'")


дальше в сессБине:
Код: java
1.
2.
3.
4.
    public List<Abonent> getAbonentFindByFIO(String x) {
        return em.createNamedQuery("Abonent.findByFIO", Abonent.class).setParameter("x", x).getResultList();

    }



и сервлет:
Код: java
1.
2.
3.
4.
        List<Abonent> a = sel.getAbonentFindByFIO("ov");
        for (Abonent ab : a) {
            System.out.println(ab.getLastName() + " " + ab.getFirstName() + " " + ab.getSurName());
        }



получаю вот такую ошибку:

Код: plaintext
1.
2.
javax.ejb.EJBException: EJB Exception: : java.lang.IllegalArgumentException: You have attempted to set a 
parameter value using a name of x that does not exist in the query string 
select a from Abonent a where  a.firstName like '%#x%'.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39194803
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Потому что параметры запроса это не шаблоны. Нельзя в любое место их лепить.

Код: java
1.
2.
3.
4.
5.
6.
@NamedQuery(name = "Abonent.findByFIO", query = "select a from Abonent a where  a.firstName like :x")

    public List<Abonent> getAbonentFindByFIO(String x) {
        return em.createNamedQuery("Abonent.findByFIO", Abonent.class).setParameter("x", "%" + x + "%").getResultList();

    }
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39194808
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

понятно спасибо, и ещё один вопрос
как можно реализовать вот такой запрос:
Код: plsql
1.
2.
select * from ABONENT where FIRST_NAME || LAST_NAME  like '%ulla%' 
or FIRST_NAME || LAST_NAME  like '%ur%' 



на сколько мне известно что знак || не поддерживается...
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39194817
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МузаффарBlazkowicz,

понятно спасибо, и ещё один вопрос
как можно реализовать вот такой запрос:
Код: plsql
1.
2.
select * from ABONENT where FIRST_NAME || LAST_NAME  like '%ulla%' 
or FIRST_NAME || LAST_NAME  like '%ur%' 



на сколько мне известно что знак || не поддерживается...

ну развери запрос типа
where FIRST_NAME like '%ulla%' OR LAST_NAME like '%ulla%'
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39194822
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321ну развери запрос типа
where FIRST_NAME like '%ulla%' OR LAST_NAME like '%ulla%'

а что если у меня поиск не только по этим полям?
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195052
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МузаффарЮрий321ну развери запрос типа
where FIRST_NAME like '%ulla%' OR LAST_NAME like '%ulla%'

а что если у меня поиск не только по этим полям?

тогда я бы освоил criteria api

Код: java
1.
2.
3.
4.
5.
6.
7.
if(pattern != null && fields != null) {
                for (String f : fields) {
                    predicatesOr.add(builder.like(
                            builder.lower(root.get(type.getDeclaredSingularAttribute(f, String.class))),
                            "%" + pattern.toLowerCase() + "%"));
                }
}



тут pattern - строка поиска, fields - список имен полей в виде массива строк.

можно отвязаться от типа
Код: java
1.
2.
            EntityType<T> type = em.getMetamodel().entity(entityClass);
            Root<T> root = cquery.from(entityClass);


и получится искать по любой таблице, любым текстовым полям из списка.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195066
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффара что если у меня поиск не только по этим полям?
Лучше взять полно-текстовый поиск встроенный в БД или вот этот
http://hibernate.org/search/
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195107
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМузаффара что если у меня поиск не только по этим полям?
Лучше взять полно-текстовый поиск встроенный в БД или вот этот
http://hibernate.org/search/
дело в том , что полно-текстовый поиск уступает по возможностям поиска по like.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195115
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядело в том , что полно-текстовый поиск уступает по возможностям поиска по like.
Так же верно и обратное утверждение. Но мне сложно представить реалистичный use case в котором имя человека нужно искать по двум буквам из середины. Поэтому когда кодер городит что-то вроде вышеприведенного, есть не малая вероятность, что про текстовый поиск он не в курсе.
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195117
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядело в том , что полно-текстовый поиск уступает по возможностям поиска по like.
Ой
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195120
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадядело в том , что полно-текстовый поиск уступает по возможностям поиска по like.
Ой
всё упирается в ту базу на которой работает система....
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39195143
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczчеловека нужно искать по двум буквам из середины
поиск по 'XXX%' т.е. по первым буквам :)
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39196134
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
появился ещё один вопрос, и прошу помочь выяснить в чем проблема:
может запросы не так как надо но все же... :)

NamedQuery (который работает):
Код: plsql
1.
SELECT a from Abonent a INNER JOIN FETCH Kabinet k ON k.idKabinet = a.kabinet.idKabinet INNER JOIN FETCH Otdel o ON o.idOtdel = k.otdel.idOtdel INNER JOIN FETCH Telefon t ON t.idTelefon = a.telefon1.idTelefon WHERE LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :q and LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :w and LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :e and LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :r and LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :t



точно этот запрос только NativeQuery :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT * FROM ABONENT 
INNER JOIN KABINET ON KABINET.ID_KABINET = ABONENT.ID_KABINET INNER JOIN OTDEL 
ON OTDEL.ID_OTDEL = KABINET.ID_OTDEL INNER JOIN TELEFON ON TELEFON.ID_TELEFON = ABONENT.ID_TELEFON 
where lower(ABONENT.FIRST_NAME || ' ' || ABONENT.LAST_NAME || ' ' || ABONENT.SUR_NAME || ' ' || OTDEL.OTDEL_NAME || ' ' || TELEFON.NOMER_TELEFON) like ?
and lower(ABONENT.FIRST_NAME || ' ' || ABONENT.LAST_NAME || ' ' || ABONENT.SUR_NAME || ' ' || OTDEL.OTDEL_NAME || ' ' || TELEFON.NOMER_TELEFON) like ?
and lower(ABONENT.FIRST_NAME || ' ' || ABONENT.LAST_NAME || ' ' || ABONENT.SUR_NAME || ' ' || OTDEL.OTDEL_NAME || ' ' || TELEFON.NOMER_TELEFON) like ?
and lower(ABONENT.FIRST_NAME || ' ' || ABONENT.LAST_NAME || ' ' || ABONENT.SUR_NAME || ' ' || OTDEL.OTDEL_NAME || ' ' || TELEFON.NOMER_TELEFON) like ?
and lower(ABONENT.FIRST_NAME || ' ' || ABONENT.LAST_NAME || ' ' || ABONENT.SUR_NAME || ' ' || OTDEL.OTDEL_NAME || ' ' || TELEFON.NOMER_TELEFON) like ?


получаю ошибку ORA-00933 но если запускаю на базе то получаю ответ...
...
Рейтинг: 0 / 0
JPA NamedQuery
    #39196137
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой прошу прошения что получился не читаемая портянка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT a from Abonent a INNER JOIN FETCH Kabinet k ON k.idKabinet = a.kabinet.idKabinet 
INNER JOIN FETCH Otdel o ON o.idOtdel = k.otdel.idOtdel 
INNER JOIN FETCH Telefon t ON t.idTelefon = a.telefon1.idTelefon WHERE 
LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :q and 
LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :w and 
LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :e and 
LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :r and 
LOWER(CONCAT(a.firstName,' ', a.lastName, ' ', a.surName, ' ' , o.otdelName, ' ', t.nomerTelefon)) LIKE :t
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA NamedQuery
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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