powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить имя пользователя не используя связку @ManyToOne
25 сообщений из 84, страница 3 из 4
Как получить имя пользователя не используя связку @ManyToOne
    #37694262
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почемуто мне кажется, что и не должно работать..
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694332
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепробовал кучу вариантов.. И со скобками разными и без скобок и через критерию... Нихрена не получалось. Получился только один вариант, но он мне что-то не сильно нравится.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class UserDTO {
    protected Account account;
    protected Long cntCom;

    public UserDTO() {}
    
    public Long getCntCom() {
        return cntCom;
    }

    public void setCntCom(Long cntCom) {
        this.cntCom = cntCom;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }
}



Код: java
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.
32.
33.
34.
    @Override
    @Transactional
    public List<UserDTO> getAllUserCntCom(Integer FirstR, Integer MaxR) {
        String sqlQuery = "select account.id_user, account.username, (select count(*) from comment where comment.id_user = account.id_user) as countCom from account";
//        Query query = sessionFactory.getCurrentSession().createQuery(sqlQuery);
//        query.setFirstResult(FirstR);
//        query.setMaxResults(MaxR);
//        
//        query.list();
        
	List list =  sessionFactory.getCurrentSession().createSQLQuery(sqlQuery).list();

	if(list.isEmpty()) {
            return null;
        }
        
        List <UserDTO> results = new ArrayList<UserDTO>();
	for(Object item : list) {
            Object[] array = (Object[]) item;

            UserDTO userDTO = new UserDTO();
            Account account = new Account();
            
            account.setId(((Number)array[0]).longValue());
            account.setUsername((String) array[1]);
            
            userDTO.setAccount(account);
            userDTO.setCntCom(((Number)array[2]).longValue());
            
            results.add(userDTO);
	}
                
        return results;
    }



Вызываю: List <UserDTO> userDTO = accountDao.getAllUserCntCom(1, 5);
В JSP получаю:
Код: xml
1.
2.
3.
            <c:forEach items="${userDTO}" var="accDTO">
                ${accDTO.account.id}, ${accDTO.account.username}, ${accDTO.cntCom} |
            </c:forEach>


Выводит всё правильно.

НО! не получилось с
// query.setFirstResult(FirstR);
// query.setMaxResults(MaxR);
.. да и вообще через задницу как-то всё.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694354
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не айс конечно, но можно как минимум упростить

Код: java
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.
@Override
    @Transactional
    public List<UserDTO> getAllUserCntCom(Integer FirstR, Integer MaxR) {
        String sqlQuery = "select account, (select count(*) from comment where comment.id_user = account.id_user) as countCom from account";
//        Query query = sessionFactory.getCurrentSession().createQuery(sqlQuery);
//        query.setFirstResult(FirstR);
//        query.setMaxResults(MaxR);
//        
//        query.list();
        
	List list =  sessionFactory.getCurrentSession().createSQLQuery(sqlQuery).list();

	if(list.isEmpty()) {
            return null;
        }
        
        List <UserDTO> results = new ArrayList<UserDTO>();
	for(Object item : list) {
            Object[] array = (Object[]) item;
            UserDTO userDTO = new UserDTO();
            userDTO.setAccount((Account)array[0]);
            userDTO.setCntCom((Long)array[1]);
            
            results.add(userDTO);
	}
                
        return results;
    }



Или так тоже не работает? Вообще надо конечно посмотреть на хибернейт "select new", давно не пользовался, может такое как я предлагал и невозможно.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694375
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое упрощение приводит к ошибке:
TomCatorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694378
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В логах
LogSEVERE: Servlet.service() for servlet [dispatcher] in context with path [/urbby] threw exception [Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'account' in 'field list'
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694384
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно оно и логично! Этож просто SQL. Есть ещё варианты как выдрать из запроса обьект и просто дополнительные поля? И при этом, чтоб работало:
// query.setFirstResult(FirstR);
// query.setMaxResults(MaxR);
.. то понаписано много, а рабочего примера так и нет. Начинает казаться, что нет возможности это реализовать стандартными методами хибера.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694395
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695243
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я видял эти странички.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
List resultWithAliasedBean = s.createCriteria(Enrolment.class)
  .createAlias("student", "st").createAlias("course", "co")
  .setProjection( Projections.projectionList()
                   .add( Projections.property("st.name"), "studentName" )
                   .add( Projections.property("co.description"), "courseDescription" )
          )
          .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )
          .list();

 StudentDTO dto = (StudentDTO)resultWithAliasedBean.get(0);


.. только не понял ничего из этого. Извините, но я наверно тупой! Можно разьяснить? А вернее лучше покажите, как из этого сделать то что мне нужно. Пожалуйста.
Что за класс Enrolment.class ? Где его описание? В DTO классе StudentDTO всего 2 строковых поля, а у меня ещё и обьект нужно.

Вариант с HQL тоже мне не прояснил ничего:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
List resultWithAliasedBean = s.createQuery(
  "select e.student.name as studentName," +
  "       e.course.description as courseDescription" +
  "from   Enrolment as e")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);



Тут получаем примитивные типы в обьект StudentDTO с двумя примитивными типами. Тоже самое можно сделать и без трансферов, а просто указать в какой класс забрать. У меня же нужно в обьекте DTO заполнить другой обьект и примитивный тип.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695314
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,
я тоже данню фичу не юзал, но могу покопать вместе. Только торопиться не будем.
Тебе на клиенте надо список
ФИО Кол-во_сообщенийиванов 15Петров 0Сидоров 15так?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695332
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,
Может и не в тему но когда пишем select new User(... нужно писать конструктор вместе с пакетом типа select new com.example.User(...
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695342
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,

ещё нашел упущение в вашем DTO нет конструтора в который передаются параметры, а ещё когда его напишите, не забудьте определить пустой конструктор.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695355
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 , ну в принципе да! Только там ещё id пользователя беру. Но это уже не принципиально я так понимаю. Главное что в DTO есть классы и примитивные типы и надо туда както выгрузить резалт. Вариант с циклом я приводил и он работает, но думаю должны быть готовые решения без циклов.

GregTk , да х.з. я делал конструктор как в примере. Т.е. пустой конструктор как и для сучности.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695365
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данная фича позволит экономить память. Не нужно будет тянуть все сообщения пользюков, чтоб потом подсчитать их size(). Не знаю, как вы умудряетесь обходится без этого. Разве что в цикле для каждого юзверя вызывать отдельный запрос select count(*) но это ИМХО бредово... ещё хуже чем в цикле заполнять как в моем примере.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695369
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabсучности

jabГлавное что в DTO есть классы и примитивные типы
dto это и есть классы = список объектов = коллекция для таблички на клиенте выше.
С минимальным кодом для ленивых программистов.
OK.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695392
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
мммм.
А почему ты не хочешь заполнить НОВУЮ коллекцию на НОВОМ классе на основе голимого sql
Код: sql
1.
select min(id), min(fio), count(*) as CntComment from user join comment group by id


Задача упрощается до:
- на основе селекта хиберу - создать коллекцию ValueObj
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695532
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда совсем дело не в селекте. Придется делать классы уникальные на каждый подобный селект. Хотя с другой стороны приходится делать теже классы примитивные с внутри с стандартными классами обьектов. Можно и так, но всеже интересно какже с вариантом DTO.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695550
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabНу тогда совсем дело не в селекте. Придется делать классы уникальные на каждый подобный селект. Хотя с другой стороны приходится делать теже классы примитивные с внутри с стандартными классами обьектов. Можно и так, но всеже интересно какже с вариантом DTO.
я тебя не понял:
- DTO сейчас не модно и оверхед
- DTO это тот же простой класс для передачи на клиента (из SELECT что я написал)
- DTO как спецификация и паттерн был очень давно, и теперь под большим вопросом.
- разве Хибер не умеет ДЕЛАТЬ классы сам на основе запроса? (должен)
Самое главное, что на каждое Окно-VIEW-форму _надо_ делать свои запросы и коллекции, если угодно.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695592
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123я тебя не понял:
- DTO сейчас не модно и оверхед
- DTO это тот же простой класс для передачи на клиента (из SELECT что я написал)
- DTO как спецификация и паттерн был очень давно, и теперь под большим вопросом.
- разве Хибер не умеет ДЕЛАТЬ классы сам на основе запроса? (должен)
Самое главное, что на каждое Окно-VIEW-форму _надо_ делать свои запросы и коллекции, если угодно.


С этого надо было начать. Но тем не менее всем спасибо! Есть как минимум 2 варианта получать нужные данные, жалко с DTO так и не решилось хоть и атовизм.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695753
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит пробую так:
http://relation.to/2133.lace
http://eldoradosoftware.blogspot.com/2009/03/hibernate-aliastobean-transformer.html

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class AccountCntCom {
    private Long id_user;
    private String username;

//    public AccountCntCom() { }
    
    public Long getId_user() {
        return id_user;
    }

    public void setId_user(Long id_user) {
        this.id_user = id_user;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    @Override
    @Transactional
    public List<AccountCntCom> getAllUserCntCom(Integer FirstR, Integer MaxR) {

        String sqlQuery = "select ac.id_user, ac.username from account ac";
    
        List resultWithAliasedBean = sessionFactory.getCurrentSession().createSQLQuery(sqlQuery)
            .addScalar("id_user")
            .addScalar("username")
            .setResultTransformer(Transformers.aliasToBean(AccountCntCom.class))
            .setCacheMode(CacheMode.GET)
            .list();

        return resultWithAliasedBean; 
    }



Чо за хрень? Пишет ошибку:
авторorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.mycom.urbby.model.AccountCntCom.id_user
И с конструктором пробовал public AccountCntCom() { } и без и с .setCacheMode(CacheMode.GET) и без и всё одна ошибка. И делал конструктор в стиле
// public AccountCntCom(Long id_user, String username) {
// this.id_user = id_user;
// this.username = username;
// }
Всё одно и тоже. В чем проблем?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695781
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общемто я ещё немного повозился и выяснил, что почемуто надо тип указывать:
.addScalar("id_user", Hibernate.LONG)
.addScalar("username", Hibernate.STRING)
Так заработала хрень.

Почему об этом не сказано в тех замечательных примерах по линкам? .. нет слов, одни эмоции.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695786
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как тоже самае сделать с помощью Criteria и HQL?
Чот не получается тоже.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695817
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,

Я делал на основе DTO и это работало, если хочешь с ним разбраться то поправь своё решение как я написал выше и покажи exception который выпадет(если выпадет :) ). Делал я это как раз на JPA с hibernate провайдером, тоже что и у тебя. А вообще по этой теме была хорошая книга Java Persistence API in Action, там достаточно подробно это всё описанно.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695820
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabПочему об этом не сказано в тех замечательных примерах по линкам? .. нет слов, одни эмоции.
У команды JBoss всё время такие косяки :) Говно-код + плохая дока.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695829
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk , выше..? это имелось в виде:
Код: java
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.
32.
33.
34.
35.
36.
public class AccountCntCom {
    private Long id_user;
    private String username;
    protected Long cntCom;

    public AccountCntCom() { }
    
    public AccountCntCom(Long id_user, String username) {
        this.id_user = id_user;
        this.username = username;
    }
    
    public Long getId_user() {
        return id_user;
    }

    public void setId_user(Long id_user) {
        this.id_user = id_user;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    
    public Long getCntCom() {
        return cntCom;
    }

    public void setCntCom(Long cntCom) {
        this.cntCom = cntCom;
    }
}
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695833
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мелкие косяки.. может в какойто момент из-за подобного и не заработало. Поправил конструктор:
Код: java
1.
2.
3.
4.
5.
    public AccountCntCom(Long id_user, String username, Long cntCom) {
        this.id_user = id_user;
        this.username = username;
        this.cntCom = cntCom;
    }
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить имя пользователя не используя связку @ManyToOne
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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