powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA / Помогите с запросом
11 сообщений из 11, страница 1 из 1
JPA / Помогите с запросом
    #38287104
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет
Код: plsql
1.
SELECT sum(z.costOneProduct*z.countProduct) FROM Orders z WHERE z.idProduct=?1 and z.idDoc.isClose=?2


стек:
Код: java
1.
java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager


пытаюсь умножить цену одного товара на их кол-во, а потом просуммировать: sum(z.costOneProduct*z.countProduct)
вот здесь и вылетает ошибка, как правильно сделать подскажите пожалуйста.
спасибо
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287153
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager


Что-то не то с передачей параметров запросу. Думаю, если посмотришь генерируемый запрос, то сам поймешь. Он наверняка он не генерируется, поэтому надо показывать не чистый SQL/HQL, а код Java.
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287166
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTстек:
[src java]
java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager

Это не стек. Это текст самого вехнего исключения. Давай весь stacktrace без купюр.
JPA точно понимает параметры вида ?1 ?
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287169
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С передачей все правильно, пробовалА сделать без умножения в sum, все получается:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Query query=man.createQuery("SELECT sum(z.costOneProduct) FROM Orders z WHERE z.idProduct=?1 and z.idProduct.isClose=?2");
           Product product=Product();

           query.setParameter(1,product);
           query.setParameter(2,true);

           double sumCost=(Double)query.getSingleResult();
           
           System.out.println("Взято товара: "+product.getNameProduct()+" на общую сумму: "+sumCost);

            man.getTransaction().commit();
            man.close();


В консоль выводит: Взято товара: Кабель Atlas Hyper v1.4 HDMI 1.4 1,5 м на общую сумму: 109.0
а вот такой запрос (с умножением) уже не работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Query query=man.createQuery("SELECT sum(z.costOneProduct*z.countProduct) FROM Orders z WHERE z.idProduct=?1 and z.idProduct.isClose=?2");

 query.setParameter(1,product);
           query.setParameter(2,true);

           double sumCost=(Double)query.getSingleResult();
           
System.out.println("Взято товара: "+product.getNameProduct()+" на общую сумму: "+sumCost);
            man.getTransaction().commit();
            man.close();
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287172
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать сделать новое свойство, в нем задать формулу. А JPQL уже по этому свойству.
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287179
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМожно попробовать сделать новое свойство, в нем задать формулу. А JPQL уже по этому свойству.
как?

вот полный стек:
Caused by: Exception [TOPLINK-8024] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EJBQLException
Exception Description: Syntax error parsing the query [""SELECT sum(z.costOneProduct*z.countProduct) FROM Orders z WHERE z.idProduct=?1 and z.idProduct.isClose=?2""], line 1, column 26: syntax error at [*].
Internal Exception: line 1:26: expecting RIGHT_ROUND_BRACKET, found '*'
at oracle.toplink.essentials.exceptions.EJBQLException.syntaxErrorAt(EJBQLException.java:379)
at oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.handleANTLRException(EJBQLParser.java:335)
at oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.addError(EJBQLParser.java:278)
at oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.reportError(EJBQLParser.java:378)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.aggregateExpression(EJBQLParser.java:1416)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.selectExpression(EJBQLParser.java:1158)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.selectClause(EJBQLParser.java:403)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.selectStatement(EJBQLParser.java:178)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.document(EJBQLParser.java:135)
at oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.parse(EJBQLParser.java:166)
at oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.buildParseTree(EJBQLParser.java:127)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:215)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:189)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:153)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.<init>(EJBQueryImpl.java:114)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.<init>(EJBQueryImpl.java:99)
at oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.createQuery(EntityManagerImpl.java:204)
... 23 more
Caused by: line 1:26: expecting RIGHT_ROUND_BRACKET, found '*'
at persistence.antlr.Parser.match(Parser.java:212)
at oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.aggregateExpression(EJBQLParser.java:1370)
... 36 more
ПОСТРОЕНИЕ УСПЕШНО ЗАВЕРШЕНО (общее время: 27 секунд)
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287181
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, сорри, забыла выделить текст
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287184
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего JPQL так не умеет
http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html
Проще всего нативный запрос использовать.
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287249
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используйте hql или native SQL. jpql не поддерживает выражений в агрегатных функциях, в соответствии с документацией там может быть либо выражение, указывающее на конкретное поле, либо * для count(*).
Hibernate - сессию можно получить следующим образом:
Код: java
1.
2.
3.
4.
	@PersistenceContext
	EntityManager em;
...
		Session session = (Session) em.getDelegate();
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287283
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczСкорее всего JPQL так не умеет
http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html
Проще всего нативный запрос использовать.
Немного длиннее получился запрос, но все работает как надо.
Код: java
1.
2.
3.
Query query=man.createNativeQuery("SELECT sum(z.cost_one_product*z.count_product) FROM Order z "
        + "WHERE z.id_product=?1 and "
        + "z.id_doc=(select p.id from Doc p where p.id=z.id_doc and p.isClose=?2)");


Спасибо IDVsbruck, и отдельное спасибо мега-человеку Blazkowicz ))
...
Рейтинг: 0 / 0
JPA / Помогите с запросом
    #38287290
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraИспользуйте hql или native SQL. jpql не поддерживает выражений в агрегатных функциях, в соответствии с документацией там может быть либо выражение, указывающее на конкретное поле, либо * для count(*).
Hibernate - сессию можно получить следующим образом:
Код: java
1.
2.
3.
4.
	@PersistenceContext
	EntityManager em;
...
		Session session = (Session) em.getDelegate();


спасибо, учту )
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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