powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Criteria API: Как сгенерить запрос select count(distinct(id)) from...
3 сообщений из 3, страница 1 из 1
Hibernate Criteria API: Как сгенерить запрос select count(distinct(id)) from...
    #34258648
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select count(distinct(t.id)) from t inner join t1 on t.id=t1.t_id

Есть две таблички:

t:id

t1:id,t_id

И два класса:

T{Integer id; Set t1s;} T1{ Integer id;Integer t_id}


List l = session.createCriteria(T.class).createAlias("t1s").add(Restrictions.eq("id", new Integer(1)).list();

объекты T в списке дублируются.

List l = session.createCriteria(T.class).createAlias("t1s").add(Restrictions.eq("id", new Integer(1)).setProjection(Projections.rowCount()).list();

Поэтому запись выше выдает число объектов, учитывая дубли.

Мне надо, чтобы дубли не учитывались, а именно был такого вида запрос:
select count(distinct(t.id)) from...

Как это сделать?

ResultTransformer трансформирует List, и дубли исчезают, но проблему это не решает.
Мне заранее надо знать - сколько результатов вернет поисковый запрос.

Пробовал SQLProjection - так и не понял, как оно работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 public   void  testCriteriaProjection()
            {
                Criteria c = Hibernate3Support.currentSession().createCriteria(Test. class );

                Projection sqlProj =  new  ProjectionTestImp1("count(distinct(this_.id))",  new  String[]{"this_.id"},  new  Type[] { Hibernate.INTEGER });
              
                c.setProjection(sqlProj);
                
                List l = c.list();

                 for  ( int  i =  0 ; i < l.size(); i++)
                    {
                        System.out.println(l.get(i));
                    }

            }

         class  ProjectionTestImp1  extends  SQLProjection
            {

                 public  ProjectionTestImp1(String sql, String groupBy, String[] columnAliases, Type[] types)
                    {
                         super (sql, groupBy, columnAliases, types);
                        // TODO Auto-generated constructor stub
                    }

                 public  ProjectionTestImp1(String sql, String[] columnAliases, Type[] types)
                    {
                         super (sql, columnAliases, types);
                        // TODO Auto-generated constructor stub
                    }
            }

Такого вида тест дает в логе:

ibernate: select count(distinct(this_.id)) from test this_
16:07:26,921 WARN JDBCExceptionReporter:71 - SQL Error: 0, SQLState: S0022
16:07:26,921 ERROR JDBCExceptionReporter:72 - Column 'this_.id' not found.

и соответствующий Exception
...
Рейтинг: 0 / 0
Hibernate Criteria API: Как сгенерить запрос select count(distinct(id)) from...
    #34258719
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то жёстко как-то. думаю проблема не существенна
в хибернэйтских факах есть соотв вопрос
от туда я поднял примерно вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Query query = getSession().createQuery(
            		"select count(*) from Xxx x, "+ 
            		"x.yyy y,  "+
            		"x.zzzz z, "+
            		"z.www w "+
            		"where y=:theY and www.ddd not in (:theD) "));

            	query.setParameterList("theD", thaD);
            }
            query.setEntity("theY", y);
             return  ((Integer)query.uniqueResult())== 0 ;
а дублирование строк при запросе ассоциации (опять же из фака) побеждается так (и тока так)
Код: plaintext
1.
List list = query.list();
			 return   new  HashSet<ZZZ>(list);
или LinkedHashset
...
Рейтинг: 0 / 0
Hibernate Criteria API: Как сгенерить запрос select count(distinct(id)) from...
    #34299840
JANDO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
privet Alexey Turn,

sqlProjection - rabotaet primerno vot tak:

Na primer:

String sql = "convert(datetime, convert(char(10), {alias}.EntryDate, 104)) as EntryDate";

Criteria criteria = hs.createCriteria(Bestelleingang.class)
.setProjection(
Projections.distinct(
Projections.sqlProjection(sql,
new String[]{"EntryDate"},
new Type[]{Hibernate.DATE})))
)
"hs" - HibernateSession.
Vajniy moment sdes et "as ...." tak kak Column - eto to 4to stoit pesle "as", naprimer "EntryDate"
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate Criteria API: Как сгенерить запрос select count(distinct(id)) from...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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