powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сформировать запрос (Criteria api)
11 сообщений из 11, страница 1 из 1
Как сформировать запрос (Criteria api)
    #38720927
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая табличка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
id  curr       price        dateStart              driver_id
1  RUB	215.00  2014-07-14 10:34:10     2
2  RUB	150.00  2014-07-14 14:23:15     2
3  RUB	150.00  2014-07-14 15:58:34	     3
4  RUB	150.00  2014-07-14 16:20:18     3
5  RUB	200.00  2014-07-14 17:40:15	     3
6  RUB	200.00  2014-08-14 09:05:03	     4
7  RUB	215.00  2014-08-14 11:15:12     2
8  RUB	200.00  2014-08-14 18:58:18     2
Мне нужно составить запрос используя Criteria API, который бы возвращал среднюю сумму в месяц (в деньгах) за последний месяц.
Непонятно именно как сделать: "сумму в месяц за последний месяц"
Помогите пожалуйста. Спасибо
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38720931
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыла добавить, возвращать по конкретному driver_id
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38720932
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTзабыла добавить, возвращать по конкретному driver_id
Так и подумал сразу.. На sql это вычисляется с помощью функции avg с group by по driver_id.
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721013
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Вы упорно игнорируете документацию!

Код: java
1.
2.
3.
4.
5.
        ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.avg("price"));
        projectionList.add(Projections.groupProperty("driver_id"));
        criteria.setProjection(projectionList);
        criteria.add(Restrictions.between("dateStart",leftDateBorder,rightDateBorder));
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721032
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverВы упорно игнорируете документацию!
Наверняка она только на английском?
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721052
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanНаверняка она только на английском?
преимущественно да, но можно найти что-то и на русском, благо форумов и блогов сейчас тьма.
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721057
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverwadmanНаверняка она только на английском?
преимущественно да, но можно найти что-то и на русском, благо форумов и блогов сейчас тьма.
Вот ТС и нашла свой форум.
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721083
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverJulT,

Вы упорно игнорируете документацию!

Код: java
1.
2.
3.
4.
5.
        ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.avg("price"));
        projectionList.add(Projections.groupProperty("driver_id"));
        criteria.setProjection(projectionList);
        criteria.add(Restrictions.between("dateStart",leftDateBorder,rightDateBorder));


это я понимаю, но, вот какая штука получается:
Моя сущность:
Код: java
1.
2.
3.
4.
5.
@Table(name = "mission")
public class Mission {
....
 @Embedded
    private Statistics statistics = new Statistics();


А уже в самом Statistics, следующее:
Код: java
1.
2.
3.
4.
5.
@Embeddable
    public static class Statistics {
        @Columns(columns = {@Column(name = "price")})
        @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
        private Money priceInFact;


В таком случае должно быть что-то вроде:
Код: java
1.
2.
3.
4.
5.
            Criteria criteria1 = session.createCriteria(Mission.class,"mission");
            ProjectionList projectionList = Projections.projectionList();
            projectionList.add(Projections.avg("mission.statistics.priceInFact"));
            projectionList.add(Projections.groupProperty("mission.driverInfo"));
            criteria1.setProjection(projectionList);


Даты я пока опустила.
Но не срабатывает, выдает ошибку:
Код: java
1.
org.hibernate.QueryException: property does not map to a single column: mission.statistics.priceInFact


скорее всего ошибка где-то здесь: avg("mission.statistics.priceInFact")
Что посоветуете?
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721249
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Как вы наверное знаете, "супер" тип org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency мапится на БД как две колонки (правда в вашем примере этого неуказанно, ну да подумаешь)
из этого следует что
Код: java
1.
projectionList.add(Projections.avg("mission.statistics.priceInFact"));

это обращение сразу к 2м полям, хибер вам об этом честно говорит в эксепшене.

Выход только один: написать свой класс обертку для денег, который будет нормально мапиться и выбираться из БД, а не совать всяку гадость в базу.
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721293
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverJulT,

Как вы наверное знаете, "супер" тип org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency мапится на БД как две колонки (правда в вашем примере этого неуказанно, ну да подумаешь)
из этого следует что
Код: java
1.
projectionList.add(Projections.avg("mission.statistics.priceInFact"));

это обращение сразу к 2м полям, хибер вам об этом честно говорит в эксепшене.

Выход только один: написать свой класс обертку для денег, который будет нормально мапиться и выбираться из БД, а не совать всяку гадость в базу.
Да, так и есть:
Код: java
1.
2.
3.
4.
 public static class Statistics {
        @Columns(columns = {@Column(name = "price"), @Column(name = "price_in_fact_amount")})
        @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
        private Money priceInFact;


"написать свой класс обертку" - можете пример привести, пожалуйста
...
Рейтинг: 0 / 0
Как сформировать запрос (Criteria api)
    #38721312
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

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


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