Будьте в спящем режиме запрос примером и проекциями

try agg() function:

import numpy as np
import pandas as pd


df = pd.DataFrame(np.random.randint(0,5,size=(20, 3)), columns=list('ABC'))
print(df)

print(df.groupby('C').agg({'A': max, 'B':min}))

Выход:

    A  B  C
0   2  3  0
1   2  2  1
2   4  0  1
3   0  1  4
4   3  3  2
5   0  4  3
6   2  4  2
7   3  4  0
8   4  2  2
9   3  2  1
10  2  3  1
11  4  1  0
12  4  3  2
13  0  0  1
14  3  1  1
15  4  1  1
16  0  0  0
17  4  0  1
18  3  4  0
19  0  2  4
   A  B
C
0  4  0
1  4  0
2  4  2
3  0  4
4  0  1

В качестве альтернативы вы можете проверить функцию pandas.read_sql_query () ...

22
задан Ryan Cook 6 June 2009 в 18:44
поделиться

3 ответа

Я могу видеть Ваш Пользовательский класс? Это просто использует ограничения ниже. Я не вижу, почему Ограничения действительно несколько отличались бы, чем Примеры (я думаю, что пустые поля проигнорированы по умолчанию в примерах хотя).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

я никогда не использовал alaistToBean, но я просто читал об этом. Вы могли также просто циклично выполниться по результатам..

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

, Если Вы имеете Вам, может вручную заполнить Пользователя самим тот путь.

Его вид трудно для изучения проблемы еще без некоторой информации для диагностирования проблемы.

17
ответ дан Arthur Thomas 29 November 2019 в 03:40
поделиться

Проблема возникает, когда у вас есть псевдоним, имя которого совпадает с именем свойства objects. Hibernate, похоже, подбирает псевдоним и использует его в sql. Я нашел это задокументированное здесь и здесь , и я считаю, что это ошибка в Hibernate, хотя я не уверен, что команда Hibernate с этим согласна.

В любом случае, я нашел простое решение, которое работает в моем случае. Ваш пробег может отличаться. Подробности ниже. Я попытался упростить код для этого примера, поэтому приношу свои извинения за любые ошибки или опечатки:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Произойдет такой sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Что вызывало ошибку: java.sql.SQLException: ORA -00904: «Y1_»: недопустимый идентификатор

Но когда я изменил свое ограничение на использование «this», например:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Получился следующий sql-файл, и моя проблема была решена.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Вот оно! Довольно простое решение болезненной проблемы. Я не знаю, как это исправление отразится на проблеме запроса на примере, но оно может приблизить вас.

Я нашел простой способ, который работает в моем случае. Ваш пробег может отличаться. Подробности ниже. Я попытался упростить код для этого примера, поэтому приношу свои извинения за любые ошибки или опечатки:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Произойдет такой sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Что вызывало ошибку: java.sql.SQLException: ORA -00904: «Y1_»: недопустимый идентификатор

Но когда я изменил свое ограничение на использование «this», например:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Получился следующий sql-файл, и моя проблема была решена.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Вот оно! Довольно простое решение болезненной проблемы. Я не знаю, как это исправление отразится на проблеме запроса на примере, но оно может приблизить вас.

Я нашел простой способ, который работает в моем случае. Ваш пробег может отличаться. Подробности ниже. Я попытался упростить код для этого примера, поэтому приношу свои извинения за любые ошибки или опечатки:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Произойдет такой sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Что вызывало ошибку: java.sql.SQLException: ORA -00904: «Y1_»: недопустимый идентификатор

Но когда я изменил свое ограничение на использование «this», например:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Получился следующий sql-файл, и моя проблема была решена.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Вот оно! Довольно простое решение болезненной проблемы. Я не знаю, как это исправление отразится на проблеме запроса на примере, но оно может приблизить вас.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Что вызывало ошибку: java.sql.SQLException: ORA-00904: «Y1_»: недопустимый идентификатор

Но когда я изменил свое ограничение на использование «this», например:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Он произвел следующий sql, и моя проблема была решена.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Вот и все! Довольно простое решение болезненной проблемы. Я не знаю, как это исправление отразится на проблеме запроса на примере, но оно может приблизить вас.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Что вызывало ошибку: java.sql.SQLException: ORA-00904: «Y1_»: недопустимый идентификатор

Но когда я изменил свое ограничение на использование «this», например:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Он произвел следующий sql, и моя проблема была решена.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Вот и все! Довольно простое решение болезненной проблемы. Я не знаю, как это исправление отразится на проблеме запроса на примере, но оно может приблизить вас.

45
ответ дан 29 November 2019 в 03:40
поделиться

У меня аналогичная проблема. Я использую запрос по примеру и хочу отсортировать результаты по настраиваемому полю. В SQL я бы сделал что-то вроде:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Он отлично работает без предложения order-by. Я получил

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

. Но когда я добавляю

crit.addOrder(Order.asc("diff"));

, я получаю исключение org.hibernate.QueryException: не удалось разрешить свойство: diff исключение. Обходной путь с , этот также не работает.

PS: так как я не смог найти какой-либо подробной документации по использованию QBE для Hibernate, все вышеперечисленное - в основном метод проб и ошибок

0
ответ дан 29 November 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: