powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить имя пользователя не используя связку @ManyToOne
84 сообщений из 84, показаны все 4 страниц
Как получить имя пользователя не используя связку @ManyToOne
    #37693701
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у меня есть таблица пользователей и таблица коментариев их.
Нужно связать их один к многим и многие к одному соответственно.
В таблице коментариев напишу:
Код: java
1.
2.
3.
    @ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
        @JoinColumn(name = "id_user")
        private Account account;



Всё какбы понятно и просто. Далее напишу метод, который вернет мне Lист с коментариями пользователей и собсно самих пользователей.. criteria.setFetchMode("account", FetchMode.JOIN); и всё такое. Передам этот Lист в JSP и там получу имя пользователя напротив каждого коментария.

А можно как-то ещё получить имя пользователя в JSP если не использовать @ManyToOne, а просто в таблице коментариев сделать поле id_user? Ну может примерчик какой есть с учетом, что TomCat 6 и нельзя там вызывать методы. Как выкрутится? Подскажите пожалуйста.
Получается в JSP передам Lист коментариев и у каждого элемента будет свойство id_user. Т.е. айдиху пользователя только получу, а как по ней имя тамже получить?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693715
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А цель какая? Не нравится JOIN? Догрузи отдельным запросом.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693717
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabА можно как-то ещё получить имя пользователя в JSP если не использовать @ManyToOne, а просто в таблице коментариев сделать поле id_user?
ты его и сделал, указав аннотацию хиберу.
Насчёт 6-ки не в курсе такого изврата, но ставь 7-ку.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693760
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА цель какая? Не нравится JOIN? Догрузи отдельным запросом.
Как отдельным запросом грузить? Нужно в самом JSP передать какойто обьект, который по id_user будет возвращать его имя? Но получается что методы не выполнить в шестерке. Как это делать?

Petro123Насчёт 6-ки не в курсе такого изврата, но ставь 7-ку.
Не могу ничего ставить там. Что есть, с тем и приходится выкручиваться.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693766
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,
в хибере afaik есть вычисляемое псевдо поле"
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693774
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabКак отдельным запросом грузить?

FetchMode.SELECT

jabНужно в самом JSP передать какойто обьект, который по id_user будет возвращать его имя?

Почему именно в JSP? Это самоцель какая-то? Или что? Почему не выбрать автора сразу?

jabНо получается что методы не выполнить в шестерке. Как это делать?

Какие методы?? О чем речь? При чем здесь вообще Tomcat? Свойства из EL отлично вызываются.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693787
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем проблема использовать @ManyToOne ?
Если хочется отказатся от ORM в пользу более "насыщенной" модели, то делаешь свойство
getAuthor(), которое по id через репозиторий вытягивает объект. Посмотри паттерн Repository у Фаулера.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693803
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема какая-то надуманная
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693814
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никПроблема какая-то надуманная
дак ему никто пример не привёл.
12192686
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693848
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПочему именно в JSP? Это самоцель какая-то? Или что? Почему не выбрать автора сразу?
А как сразу то? Должна быть колекция сообщений у которых должно быть свойство обьект пользователь (private Account account;), а не просто его id_user. Ну или хотябы свойство имя пользователя или тот параметр, который мне нужен. Это мне заранее надо както в моделе сообщений прописывать или делать ещё одну модель сообщений с этим свойством спецально заточенную под это дело?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693852
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так. По порядку.

jabВсё какбы понятно и просто. Далее напишу метод, который вернет мне Lист с коментариями пользователей и собсно самих пользователей.. criteria.setFetchMode("account", FetchMode.JOIN); и всё такое. Передам этот Lист в JSP и там получу имя пользователя напротив каждого коментария.
Что не так в этой модели? Почему хочется сделать иначе?:
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693863
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabДолжна быть колекция сообщений у которых должно быть свойство обьект пользователь (private Account account;), а не просто его id_user.
Если использовать прокси, то так и будет. С той лишь разницей что id будет не в comment.id_user, а в comment.user.id.
Какая разница где он находится? На что это влияет?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693876
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЧто не так в этой модели? Почему хочется сделать иначе?
С этой моделью всё хорошо и всё в порядке. Именно так я делал раньше. А сейчас вот получилось так, что у меня нет этой связки, а есть просто колумн id_user. Вот по этому и хотел узнать, как можно добраться до имени пользователя, не переделывая модель под много к одному. Т.е. может есть простой способ добраться, про который я не знаю. Хотел расширить кругозор.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693879
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,
я читал такие подходы:
- действительно, view модель не соответствует модели хибера, поэтому перед отдачей в респонс её доводят черед DTO\VO\JOIN
Но мне это не нравится, т.к. я ленивый программист.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693886
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabА сейчас вот получилось так, что у меня нет этой связки, а есть просто колумн id_user.
А куда она делась?

jabВот по этому и хотел узнать, как можно добраться до имени пользователя, не переделывая модель под много к одному. Т.е. может есть простой способ добраться, про который я не знаю. Хотел расширить кругозор.
Можно добавить транзиентное поле в коментарии. И после загрузки проставить автора. Желательно всё это делать до JSP. Тогда и вопросов как тот или иной метод вызывать из JSP не будет.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693887
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на хабре обсуждалось, нужны ли id на клиенте и как их заменять на имена или развёрнутые связки.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693893
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот, насчет лени. У меня сейчас есть:
Код: java
1.
2.
    @Column(name="id_user", nullable=true)
	private Long id_user;



А нужно переделать на:
Код: java
1.
2.
3.
    @ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
        @JoinColumn(name = "id_user")
        private Account account;



Соответственно в табличке с комментами нужно добавить FK на акаунт, ну или выгрузить все данные, перекриэйтить таблички хибером всё заново и загрузить данные поверх в пустые новые таблички. Как-то много действий надо делать.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693911
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab,
приведи структуру таблиц в БД реальную "сейчас есть".
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693914
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя может и правда, имеет смысл делать облегченные модельки. И грузить в них только нужное .createSQLQuery(query).list(); из запроса. Потом эту модельку отдавать в JSP. Там обращаться к свойствам. Всё получается просто и понятно и минимум памяти отнимет на неиспользуемое. Только получится ухожу от FK в БД. Целостность придется как-то вручную поддерживать.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693922
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabЦелостность придется как-то вручную поддерживать.
плохо. Лучше переделать. Приведи схемку.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693935
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот минимум что нужно (если угадал)
Код: 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.
public class Book {
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "id_book", targetEntity = Comment.class)
	private List<Comment> comments;
	
public class Comment {
  @ManyToOne()
  private Book id_book;
----------------------------
create table Book (
        id  bigserial not null,
        Name varchar(255) not null,
        primary key (id)
    )

    create table Comment (
        id  bigserial not null,
        MyName varchar(255) not null,
        id_book_id int8,
        primary key (id)
    )

    alter table Comment 
        add constraint FK9BDE863FC891AF2 
        foreign key (id_book_id) 
        references Book
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693946
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123приведи структуру таблиц в БД реальную "сейчас есть".
Задолбаюсь тут приводить структуры.. там много чего надо приводить и разбираться потом в этом никому не захочется.

Petro123
Смотри! Попробую на словах обьяснить. Идея такая. Есть у меня пользователи и есть у пользователей публикации. Пользователей может быть много и у каждого пользователя может быть много публикаций. Публикация из себя представляет обложку, наименование, некоторое описание, текст публикации, к каким категориям относится, ну и ещё некоторые параметры. Мне нужно получить мои публикации, при этом я должен видять только обложку, наименование, описание, к каким категориям относится, дату создания, количество коментариев. Собсно почти все за исключением массивного поля текста публикации. И вот ещё важный момент. Мне нужно получить количество коментариев, а не колекцию этих коментариев. Так бы я через связки получил колекцию и узна size(), но нахрена козе баян? Нахрена лишние обьекты ради сайза? Нахрена мне текст публикации, если его я не должен видять в списке моих публикаций, а он порядком места будет занимать до 200 000 символов. Так вот тянуть весь этот обьем из БД в память как бы не рационально и не оправдывает это простоту написания кода. Надо чтото усложнить в коде, но меньше грузить память и БД. Вот и думаю делать простые модельки для каждого случая, но не замапленные на таблички. В них выбирать запросом нужное. Как такая мысль?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693963
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы узнать size у коллекции совсем не обязательно тянуть всю коллекцию, причем это в хибернейте с самого начала.
int count = select * from Comments c where c.user.id = : userId
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693964
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz А куда она делась?
Не делось, просто новый проект. Так вот почемуто сразу не сделал, а теперь вот что есть, то есть.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693970
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabКак такая мысль?
ты не ответил, выше код подходит?
Учти одни непреложные правила:
- первична доменная модель и идти надо не от view а от текста-КОДА что я привёл выше.
- именно для этого модель в БД нормализуют ДЛЯ бд, а не для удобства в JSP
- чтобы не грузить, есть LAZY
??
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693973
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё.
Для FK не надо ничего и никуда выгружать. Структура не меняется.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693980
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никчтобы узнать size у коллекции совсем не обязательно тянуть всю коллекцию, причем это в хибернейте с самого начала.
int count = select * from Comments c where c.user.id = : userId


Не понял. Есть public List<Article> и у каждого Article есть private Set<Comment> comments;
Как же узнать сайз Set<Comment> не затянув его?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37693984
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ты не ответил, выше код подходит?
Примерно аналогично я и делал, только с LAZY
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694003
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabНе понял. Есть public List<Article> и у каждого Article есть private Set<Comment> comments;
Как же узнать сайз Set<Comment> не затянув его?
Никто так не делает. У юзеров тысячи коментариев. Никто не затягивает всю коллекцию. Размер получают отдельным COUNT запросом.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694006
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabКак же узнать сайз Set<Comment> не затянув его?
насколько в курсе, то код в JSP выполняется в момент рендеринга в респонсе. Т.е. всё что нужно ДОЛЖНО быть загружено. Иначе, сессия хибера будет закрыта и будет исключение.
Приведи кусок кода для "зачем узнать размер коллекции"
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694022
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@OneToMany
@org.hibernate.annotations.LazyCollection(
org.hibernate.annotations.LazyCollectionOption.EXTRA
)
private Set<Child> children = new HashSet<Child>();



Parent p = // execute query to load desired parent
// due to lazy loading, at this point p.children is a proxy object
int count = p.getChildren().size(); // the collection is not loaded, only its size
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694030
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никint count = p.getChildren().size(); // the collection is not loaded, only its size

И правда. Был не прав. AbstractCollectionPersister.generateSelectSizeString(...)
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694056
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мм.. а теперь как этим способом мне вывести количество коментариев в JSP?
Допустим я имею отдель но табилчку пользователей и отдельно табличку коментариев.
Делаю простую страничку, на которую мне надо вывести всех пользователей с их количеством коментариев.
Например для MySQL:
select user.*, (select count(*) from comment where comment.id_user = user.id_user) as countCom from user

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

Для этой задачи только HQL/SQL. Иначе (если через коллекции), то будет COUNT запрос на каждого юзера.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694073
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из этого запроса я могу выдрать модель user и у меня останется ещё параметр countCom, которыхй какбы нужно прикрутить к пользователю както... Мм... не знаю как..
Код: java
1.
2.
3.
4.
5.
6.
7.
    @Override
    @Transactional
    public List<Category> getAllUserCntCom() {
        String sqlQuery = "select user.*, (select count(*) from comment where comment.id_user = user.id_user) as countCom from user";
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class, sqlQuery);
	return criteria.list();
    }



Как?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694085
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это получается что надо делать ещё одну модель User с стандартными параметрами и с параметром countCom? Например назвать модель UserCntCom и в критерию её.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694087
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или даже не с стандартными параметрами, а наследник User и с доп параметром.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694111
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нузачем сразу новую сущность? Создай простое DTO.

и получи вот так

select new UserDTO(u, countCom)
from select user.* as u , (select count(*) from comment where comment.id_user = user.id_user) as countCom from user
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694129
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никСоздай простое DTO.
Как их делают то?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694131
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никselect new UserDTO(u, countCom)
Не знаю такую конструкцию. Куда это писать то?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694135
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab
Код: java
1.
        String sqlQuery = "select user.*, (select count(*) from comment where comment.id_user = user.id_user) as countCom from user";



А зачем подзапрос? Почему через group by не сделать?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694136
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabНе знаю такую конструкцию. Куда это писать то?
HQL
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694144
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА зачем подзапрос? Почему через group by не сделать?
Потому что group by не будет работать с user.*

В общем возвращаясь к DTO.
У меня была мысль сделать класс с двумя пропертями. Первый пропертя это обьект Urer, а второй пропертя это Integer countCom.

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

DTO - это простой класс, без аннотации Entity, все это делается через hql. Кстати DTO - это еще и паттерн но тут он используется не совсем классически
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694152
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabПоискал... чот не нахожу ничего подходящего.
Блин это как надо было искать?
Гугл -> Hibernate HQL
Первая же ссылка
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html
Ctrl+F -> new
14.6. The select clause - куча примеров
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694155
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabПотому что group by не будет работать с user.*

Можно через join сделать. Ну, это уже оптимизация на будущее, если что.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694181
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никDTO - это простой класс, без аннотации Entity, все это делается через hql.
Это понятно.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class UserDTO {
    protected User user;
    protected Integer cntCom;


    public Integer getCntCom() {
        return cntCom;
    }

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}



Дальше то что писать?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Override
    @Transactional
    public List<Article> getAllUserCntCom(Integer FirstR, Integer MaxR) {
        String sqlQuery = "select new UserDTO(u, countCom) from select user.* as u , (select count(*) from comment where comment.id_user = user.id_user) as countCom from user";
        Query query = sessionFactory.getCurrentSession().createQuery(sqlQuery);
        query.setFirstResult(FirstR);
        query.setMaxResults(MaxR);
                
        return query.list();
    }



Так чтоли?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694183
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.. очепятка List<Article>

List<UserDTO>
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694185
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и? не работает чтоли?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37694255
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно не работает!

TomCatorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: select near line 1, column 38 [select new UserDTO(u, countCom) from select account.* as u , (select count(*) from comment where comment.id_user = account.id_user) as countCom from account]

У меня табличка с ерами по другому называется. Ещё раз:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class UserDTO {
    protected Account account;
    protected Integer cntCom;


    public Integer getCntCom() {
        return cntCom;
    }

    public void setCntCom(Integer 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.
    @Override
    @Transactional
    public List<UserDTO> getAllUserCntCom(Integer FirstR, Integer MaxR) {
        String sqlQuery = "select new UserDTO(u, countCom) from select account.* as u , (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);
                
        return query.list();
    }



И вызываю: List <UserDTO> userDTO = accountDao.getAllUserCntCom(1, 5);
ошибка.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @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
Как получить имя пользователя не используя связку @ManyToOne
    #37695904
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jab, еще в запросе укажи имя конструктора с пакетом.
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695910
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант
Код: java
1.
2.
3.
4.
5.
6.
	public List<KillStat> findTopKillers(int firstResult, int maxResults) {
		Query query = sessionFactory.getSession().createQuery("select new KillStat(sum(k.killCount), k.killer) from KillEntry k group by k.killer order by sum(k.killCount) desc, k.killer.id desc");
		query.setFirstResult(firstResult);
		query.setMaxResults(maxResults);
		return query.list();
	}
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695978
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорей всего так не заработает, напиши как я поправил ниже(укажи конструктор с пакетом)
Petro123вариант
Код: java
1.
2.
3.
4.
5.
6.
	public List<KillStat> findTopKillers(int firstResult, int maxResults) {
		Query query = sessionFactory.getSession().createQuery("select new com.example.dto.KillStat(sum(k.killCount), k.killer) from KillEntry k group by k.killer order by sum(k.killCount) desc, k.killer.id desc");
		query.setFirstResult(firstResult);
		query.setMaxResults(maxResults);
		return query.list();
	}
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695980
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

хибер помойму не понимает как определить какого класса конструктор
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695981
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак. Новые вести с поля боя. Пока не доканая, не успокоюсь. В очередной раз разбираюсь с HQL. Вот очередная загдка.
Значит имею такое:
Код: 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.
37.
public class AccountCntCom {
    private Long id_user;
    private String username;
    protected Long cntCom;

    public AccountCntCom() { }
    
    public AccountCntCom(Long id_user, String username, Long cntCom) {
        this.id_user = id_user;
        this.username = username;
        this.cntCom = cntCom;
    }
    
    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;
    }
}



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

        String sqlQuery = "select ac.id_user, ac.username from Account ac";
        
        List list = sessionFactory.getCurrentSession().createQuery(sqlQuery)
            .setResultTransformer( Transformers.aliasToBean(AccountCntCom.class))
            .list();

        return list; 
    }



Выполняю и выдает ошибку:
авторorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class com.mycom.urbby.model.AccountCntCom

Я подумал, что надо как-то ему указать какие поля в какие сеттеры пихать. Порыл проперти и методы для createQuery и что-то ничего подходящего не нашел. Осталось попробовать так:
Код: java
1.
String sqlQuery = "select ac.id_user as id_user, ac.username as username from Account ac";


И о чудо!..бл*.. Заработало! Ну ведь нихрена не поменялось по сути! Почему?

Теперь следующий вопрос. Как заставить работать с таким запросом:
Код: java
1.
String sqlQuery = "select ac.id_user as id_user, ac.username as username, (select count(*) from Comment cm where cm.id_user = ac.id_user) as cntCom from Account ac";


Выдает ошибку:
авторorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.QueryException: could not resolve property: id_user of: com.mycom.urbby.model.Comment [select ac.id_user as id_user, ac.username as username, (select count(*) from com.mycom.urbby.model.Comment cm where cm.id_user = ac.id_user) as cntCom from com.mycom.urbby.model.Account ac]
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37695995
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это быть из-за того, что с сучности Comment у меня по сути нет поля id_user, а заместо этого так:
Код: java
1.
2.
3.
    @ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
        @JoinColumn(name = "id_user")
        private Account account;



Что тогда делать?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37696020
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jabнихрена не поменялось по сути! Почему?
поменял - имена полей совпали. Было ac.id_user стало id_user
авторКак заставить работать с таким запросом:
ищи примеры в сети вместе с Transformer
(имена полей нового запроса должны совпасть с ДТО и указать типы полей)
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37697529
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё у меня вопрос по критерию.
Есть у меня 2 таблички. Ленивая связка между ними. Но я иногда выбираю по полной связке так:
Код: java
1.
2.
3.
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Category.class);
        criteria.add(Restrictions.eq("id_categ", id_categ));
        criteria.setFetchMode("articles", FetchMode.JOIN);



Таким образом получаю лист категорий с заполненным сетом articles. Но яб хотел, чтоб было дополнительное условие. В табличке article.enabled = true.
Просто добавить criteria.add(Restrictions.eq("enabled", true)); не канает и не канает criteria.add(Restrictions.eq("articles.enabled", true));
Что надо добавить ещё?
...
Рейтинг: 0 / 0
Как получить имя пользователя не используя связку @ManyToOne
    #37697535
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я посмотрел, какой запрос генерит хибер:
Код: sql
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.
    select
        this_.id_categ as id1_3_1_,
        this_.catName as catName3_1_,
        this_.catTitle as catTitle3_1_,
        this_.id_par as id4_3_1_,
        articles2_.id_categ as id2_3_,
        article3_.id_article as id1_3_,
        article3_.id_article as id1_2_0_,
        article3_.artAutor as artAutor2_0_,
        article3_.artDescription as artDescr3_2_0_,
        article3_.artName as artName2_0_,
        article3_.artReyting as artReyting2_0_,
        article3_.artText as artText2_0_,
        article3_.artViews as artViews2_0_,
        article3_.coverPath as coverPath2_0_,
        article3_.dateUpload as dateUpload2_0_,
        article3_.enabled as enabled2_0_,
        article3_.id_user as id11_2_0_ 
    from
        category this_ 
    left outer join
        art_categ articles2_ 
            on this_.id_categ=articles2_.id_categ 
    left outer join
        article article3_ 
            on articles2_.id_article=article3_.id_article 
    where
        this_.id_categ=?


подумал немного и в наглую запердолил:
Код: java
1.
2.
3.
4.
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Category.class);
        criteria.add(Restrictions.eq("id_categ", id_categ));
        criteria.setFetchMode("articles", FetchMode.JOIN);
        criteria.add( Expression.sql("article3_.enabled = 1"));


и все заработало. НО! Мне не нравится этот способ. Всегда ли хибер будет именно такой алиас генерить или можно както ему подсказывать какой алиас генерить? Да и нетбинс перечеркивает мне конструкцию Expression.sql Видимо намекая мол не лучший способ.
...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить имя пользователя не используя связку @ManyToOne
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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