Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите,пожалуйста, составить sql запрос!!! 
V
    Опции темы
Swatch
Дата 30.1.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



Добрый день.

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

нужно, чтобы этот запрос выполнялся в критерии выборки для хибернейта:

вот создание критерия:
Код

public Criteria createCriteria(Session session) {
        Criteria c = session.createCriteria(statements.class);
      /*  c.add(Expression.eq("category_id", _category_id));
        c.add(Expression.sql("select * from author where statements.author_id = author.id and category.id = statements.category_id"));
        c.setResultTransformer(c.DISTINCT_ROOT_ENTITY);
        c.addOrder(Order.asc("id"));*/
        return c;
    }


Помогите, пожалуйста, что в этом критерии надо исправить, чтобы все заработало?!  smile 
сейчас пишет ошибку:
Код

30.01.2008 16:40:23 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 335544569, SQLState: HY000
30.01.2008 16:40:23 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 475

Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.loader.Loader.doList(Loader.java:2214)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
        at org.hibernate.loader.Loader.list(Loader.java:2090)
        at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
        at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
        at com.company.proj.database.HibernateUtil.Load(HibernateUtil.java:103)
        at com.company.proj.MainForm.treeChange(MainForm.java:518)
        at com.company.proj.MainForm.<init>(MainForm.java:101)
        at com.company.proj.ClientMain.main(ClientMain.java:36)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 475

        at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:119)
        at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:41)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at org.firebirdsql.jdbc.FBStatementFactory.createPreparedStatement(FBStatementFactory.java:90)
        at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:869)
        at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:824)
        at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:817)
        at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:293)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:415)
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1538)
        at org.hibernate.loader.Loader.doQuery(Loader.java:661)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
        at org.hibernate.loader.Loader.doList(Loader.java:2211)
        ... 9 more
Java Result: 1


PM MAIL   Вверх
iluvatar
Дата 30.1.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Во-первых, непонятно что у тебя за проблема. Проблема с соединением hibernate, генерацией запроса или составлением запроса?
А во-вторых эта тема уже поднималась. линк. Зачем создавать новую? Напиши что именно не так и что тебе непонятно.
PM MAIL ICQ   Вверх
Swatch
Дата 30.1.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



мне не понятно, как составить запрос (или критерий выборки), чтобы с помощью хибернейта получить эти данные... 
PM MAIL   Вверх
iluvatar
Дата 31.1.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



у тебя есть список сообщений. у каждого сообщения есть категория и автор. тебе нужно получить список авторов, написавших эти сообщения?

скажу сразу, лучше использовать HQL (подробнее).
PM MAIL ICQ   Вверх
Swatch
Дата 31.1.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



написавших эти сообщения в конкретной категории...
PM MAIL   Вверх
iluvatar
Дата 31.1.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



то есть я понял так:
 
Описание классов:
Код

public class Topic{
  private int id;
  private String name;
   ...
}

public class Author{
  private int id;
  private String name;
}

public class Message{
  private int id;
  priivate String text;
  private int authorId;
  private int topicId;
  ...
}



На каком-то этапе имеем List<Message> messages. Надо получить всех авторов этих сообщений для какой-то отдельной темы.
Проще всего сначала отделить все сообщения этой темы из списка сообщений и сразу берем только id. Сделать это не в запросе, а заранее. 
То есть теперь у нас есть List topicMessagesIds

Код

"SELECT DISTINCT author.id FROM Author author WHERE author.id = (SELECT msg.authorId FROM Message msg WHERE msg.id in (:p_msg_ids))"


Это для HQL. Для критериев чуть посложнее - надо использовать алиасы. Кроме того, если понадобится получить не только id авторов, но и сами объекты и сделать сортировку, то делать придется в 2 захода. (читай ссылку, которую я тебе дал).

Если я что-то не так понял, напиши.


Это сообщение отредактировал(а) iluvatar - 31.1.2008, 11:06
PM MAIL ICQ   Вверх
Swatch
Дата 31.1.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



мне надо получить не просто ид_авторов, мне надо получить список авторов, такой же, как List<Message> messages, со всеми вытекающими последствиями, то есть чтобы можно было обращаться к элементам списка, брать значения.... то есть сортировку можно не делать, но сами объекти получить обязательно, причем обязательно в виде списка...

я прочитала ссылку, которую вы дали... но, если честно, я не понимаю, как переделать то, что вы написали в критерий...  smile 

и что вот это (:p_msg_ids) такое???

у меня есть классик, с помощью которого я должна получить список авторов... вот этот классик:
Код

public class authbymes_list implements IList {

    private List _list;
    private category _category_id;
    
    
    
    public Criteria createCriteria(Session session) {
        Criteria c = session.createCriteria(statements.class);
        .......///что тут писать АБСОЛЮТНО не представляю....  :(
        return c;
    }

    public authbymes_list(category category_id) {
        _category_id = category_id;

    }

    public void setList(List result) {
        _list = result;
    }

    public List getList() {
        return _list;
    }

    public void copyTo(Object dest) {
    }
}



но с составлением критерии выборки я пока теряюсь.... там можно написать HQLзапрос? а можно его переделать в критерию? если можно, то подскажите, пожалуйста, КАК???  smile 
PM MAIL   Вверх
Kangaroo
Дата 31.1.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(Swatch @  31.1.2008,  11:07 Найти цитируемый пост)
но с составлением критерии выборки я пока теряюсь.... там можно написать HQLзапрос? а можно его переделать в критерию?

Вам нужно написать HQL запрос или использовать критерию? Это же разные вещи.. В критерию вы засовыаете объект-шаблон по которому искать.
Покажите класс statements


--------------------
Lost....
PM MAIL MSN   Вверх
Llucas
Дата 31.1.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


J2EE Developer
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 29.11.2006
Где: Одесса

Репутация: нет
Всего: нет



Нарисуй структуру таблиц и мы тебе напишем HQL запрос, который вернет тебе нужные объекты. И не придеться мудрить с Criteria.
PM MAIL WWW   Вверх
Swatch
Дата 31.1.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



author.class
Код

public class author implements IEntity, java.io.Serializable{

    private Long id;
    private String name;
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void copyTo(Object dest) {
        author obj = (author) dest;
        obj.setId(this.getId());
        obj.setName(this.getName());
    }


category.class
Код

public class category implements IEntity, java.io.Serializable {
    private Long id;
    private String title;
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    
    public void copyTo(Object dest) {
        category obj = (category) dest;
        obj.setId(this.getId());
        obj.setTitle(this.getTitle());
    }

    public String toString() {
        return getTitle();
    }


statements.class
Код

public class statements implements IEntity, java.io.Serializable {
    
    private Long id;
    private author author_id;  
    private category category_id;
    private String text;
    private String title;
    private byte[] attachment;
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public author getAuthor_id() {
        return author_id;
    }

    public void setAuthor_id(author author_id) {
        this.author_id = author_id;
    }      
    
    public category getCategory_id() {
        return category_id;
    }

    public void setCategory_id(category category_id) {
        this.category_id = category_id;
    }  
    
    public Blob getAttachment() {
        if (this.attachment == null)
            return null;
        else
            return Hibernate.createBlob(this.attachment);
    }

    public void setAttachment(Blob attachment) {
      this.attachment = ByteArray.toByteArray(attachment);
    }
    
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    
    public void copyTo(Object dest) {
        statements obj = (statements) dest;
        obj.setId(this.getId());
        obj.setAuthor_id(this.getAuthor_id());
        obj.setCategory_id(this.getCategory_id());
        obj.setAttachment(this.getAttachment());
        obj.setText(this.getText());
        obj.setTitle(this.getTitle());
    }    


вот это классики для создания таблиц с помощью хибернейта. Думаю, из них структура понятна... 
PM MAIL   Вверх
Ornitos
Дата 31.1.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.10.2007
Где: Непал

Репутация: 1
Всего: 3



Цитата(Kangaroo @  31.1.2008,  12:18 Найти цитируемый пост)
В критерию вы засовыаете объект-шаблон по которому искать.

Поиск по образцу и критерии -- не одно и тоже.


Цитата(iluvatar @  31.1.2008,  10:59 Найти цитируемый пост)
Кроме того, если понадобится получить не только id авторов, но и сами объекты и сделать сортировку, то делать придется в 2 захода.

Если в классе Message был бы не идентификатор автора, а ссылка на объект автора, то можно было бы обойтись одним запросом с Projection. 

Структуру таблиц лучше не рисуй. А покажи твои аннотированные классы, по которым нужна выборка. Или хмл метаданные, если ты их используешь.

Добавлено через 7 минут и 20 секунд
Идея примерно такая

Код

category categoryToSearchIn = // ... 
Criteria c = session.createCriteria(statements.class).
    add(Restrictions.eq("category_id", categoryToSearchIn)).
    setProjection(Projections.distinct(Projections.property("author_id")));


Чтобы искать по идентификатору категории или имени, нужно добавить простой подзапрос
PM MAIL WWW   Вверх
Swatch
Дата 31.1.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



объясните, пожалуйста, критерий, который вы написали... точнее, последнюю строку. что она делает???
понятно, что add(Restrictions.eq("category_id", categoryToSearchIn)) - накладывает ограничение на выборку - выбор по конкретной категорий.... а дальше???

и все-таки, я ведь получу список сообщений, а не список авторов, раз 

Код

Criteria c = session.createCriteria(statements.class)


а как потом брать данные об авторах??? мне список авторов нужен, чтобы в построить дерево
категория1
        автор1.1
        автор1.2
        ....
категория2
        автор2.1
        автор2.2
        ...
PM MAIL   Вверх
iluvatar
Дата 31.1.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Цитата(Swatch @  31.1.2008,  12:07 Найти цитируемый пост)

и что вот это (:p_msg_ids) такое???


это параметр. потом делаем setList("p_msg_ids", msg_ids) и все снова ХА-РА-ШО! В принципе можно сразу подставлять список (т.е. ...in (msg_ids) ..)

Скажи, а пользоваться критериями обязательно? Просто я долго их испольховал, но потом перешел на hql. Это намного удобнее и эффективней. Очень часто бывает такое, что sql-запрос составить легко, а перенести на критерии уже сложнее (как в твоем случае). 



PM MAIL ICQ   Вверх
Swatch
Дата 31.1.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



дело в том, что я свою работу с БД начала не с SQL-я, а сразу с хибернейта... конечно, базовые знания SQL-я были... вот сейчас изучаю постепенно SQL более подробно... а к критериям уже привыкла... они понятнее кажутся... а где можно про hql почитать? думаю, даже уверена, что может понадобиться....

Всем, спасибо. задача решена. 

PM MAIL   Вверх
Ornitos
Дата 31.1.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.10.2007
Где: Непал

Репутация: 1
Всего: 3



Цитата(Swatch @  31.1.2008,  15:10 Найти цитируемый пост)
где можно про hql почитать?

http://www.manning.com/bauer2/

Где-то в инете я находил бесплатную электронную версию

Это сообщение отредактировал(а) Ornitos - 31.1.2008, 15:18
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.