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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не идет Hibernate->SQLQuery, из бд работает??? 
V
    Опции темы
Killer_13
Дата 11.6.2012, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил решить свою проблему грубым способом, но он работает. Заносит записи в бд, но я не могу их прочитать!
Из консоли, все запросы проходят, все выдает, даже ArrayList-ы печатаются, а вот насмотрелся примеров, делаю 1в1, но все-равно не могу извлечь из бд?

Что не так?

Вот запрос,
Код

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List moveHystory = new ArrayList();
moveHystory = (List)session.createSQLQuery("select moveHystoryPlayer1 from games where serverName='"+serverName+"'").list();
session.getTransaction().commit();


Класс.
Код

@Entity
@Table(name="games")
public class SaveParams {
    
    @Id
    @Column(name="serverName")
    private String serverName;
    
    //@Column(name="boardMatrix") private ArrayList boardMatrix;
    @Column(name="namePlayer1") private String namePlayer1;
    @Column(name="namePlayer2") private String namePlayer2;
    @Column(name="piecesColorPlayer1") private String piecesColorPlayer1;
    @Column(name="piecesColorPlayer2") private String piecesColorPlayer2;
    @Column(name="moveHystoryPlayer1") private ArrayList<String> moveHystoryPlayer1;
    @Column(name="moveHystoryPlayer2") private ArrayList<String> moveHystoryPlayer2;
    
    
    public SaveParams() {
        
    }

    public String getServerName() {
        return serverName;
    }

    public void setServerName(String serverName) {
        this.serverName = serverName;
    }

//    public ArrayList getBoardMatrix() {
//        return boardMatrix;
//    }
//
//    public void setBoardMatrix(ArrayList boardMatrix) {
//        this.boardMatrix = boardMatrix;
//    }

    public String getNamePlayer1() {
        return namePlayer1;
    }

    public void setNamePlayer1(String namePlayer1) {
        this.namePlayer1 = namePlayer1;
    }

    public String getNamePlayer2() {
        return namePlayer2;
    }

    public void setNamePlayer2(String namePlayer2) {
        this.namePlayer2 = namePlayer2;
    }

    public String getPiecesColorPlayer1() {
        return piecesColorPlayer1;
    }

    public void setPiecesColorPlayer1(String piecesColorPlayer1) {
        this.piecesColorPlayer1 = piecesColorPlayer1;
    }

    public String getPiecesColorPlayer2() {
        return piecesColorPlayer2;
    }

    public void setPiecesColorPlayer2(String piecesColorPlayer2) {
        this.piecesColorPlayer2 = piecesColorPlayer2;
    }

    public ArrayList<String> getMoveHystoryPlayer1() {
        return moveHystoryPlayer1;
    }

    public void setMoveHystoryPlayer1(ArrayList<String> moveHystoryPlayer1) {
        this.moveHystoryPlayer1 = moveHystoryPlayer1;
    }

    public ArrayList<String> getMoveHystoryPlayer2() {
        return moveHystoryPlayer2;
    }

    public void setMoveHystoryPlayer2(ArrayList<String> moveHystoryPlayer2) {
        this.moveHystoryPlayer2 = moveHystoryPlayer2;
    }

}


запись в таблице есть, теперь осталось ее извлечь или целым классом или по одному параметру, все-равно.

пробовал вот так 
Код

SaveParams result = (SaveParams)session.load(SaveParams.class, serverName);

- в итоге ничего не получил, все по нулям.

Если нельзя вытащить отдельный объект, то как вытащить ArrayList и String?

И как можно сохранить объект boardMatrix? В нем 144 значения Integer. Hibernate говорит, что значение сл велико для одной колонки. :(

Спасибо за помощь, и подсказки.!

PM MAIL   Вверх
Vasay
Дата 11.6.2012, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Killer_13

Какие ошибки выдает Hibernate? Какой SQL код генерит (отладка в настройках Hibernate включена)?

Цитата(Killer_13 @  11.6.2012,  17:07 Найти цитируемый пост)
moveHystory = (List)session.createSQLQuery("select moveHystoryPlayer1 from games where serverName='"+serverName+"'").list();


У Вас класс SaveParams, почему from games ? 

 Параметр хорошо бы добавлять через setParameter().



--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  11.6.2012,  21:45 Найти цитируемый пост)
Какие ошибки выдает Hibernate? Какой SQL код генерит (отладка в настройках Hibernate включена)?
 - никаких ошибок, все без ошибок.

Вот конф
Код

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

      <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/chessdb</property>
        <property name="connection.username">root</property>
        <property name="connection.password">killer</property>

      <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

      <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">2</property>

      <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        
         <property name="hibernate.hbm2ddl.auto">update</property>

      <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

      <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        
        <mapping class="chess.db.SaveParams"/>

    </session-factory>

</hibernate-configuration>




Цитата(Vasay @  11.6.2012,  21:45 Найти цитируемый пост)
У Вас класс SaveParams, почему from games ? 
 - переименовал таблицу в saveparams.

Что в первом случае, что теперь получаю 1 объект с непонятными числами int.
В чем подвох? Спасибо!


PM MAIL   Вверх
Vasay
Дата 12.6.2012, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  11.6.2012,  17:07 Найти цитируемый пост)

@Column(name="moveHystoryPlayer1") private ArrayList<String> moveHystoryPlayer1;    
@Column(name="moveHystoryPlayer2") private ArrayList<String> moveHystoryPlayer2;


Думаю, нужно еще добавить аннотацию @ElementCollection и можно добавить @CollectionTable
http://docs.jboss.org/hibernate/core/3.6/r...ctions-ofvalues



Цитата(Killer_13 @  12.6.2012,  00:22 Найти цитируемый пост)
Что в первом случае, что теперь получаю 1 объект с непонятными числами int.В чем подвох? Спасибо!


Так.  Вы пытаетесь выполнить SQL (а не HQL )  запрос (а почему бы не HQL?). 
Тогда смотрите: http://docs.jboss.org/hibernate/orm/3.3/re...l/querysql.html
В этом случае Hibernate понятия не имеет что Вы там извлекаете с помощью SQL и возвращает List of Object arrays (Object[])

Как я понимаю
Object[] в Вашем случае содержит один элемент (так как Вы запрашиваете только moveHystoryPlayer1).  И, я думаю, это будет одно число - id по которому таблица games связана с таблицей moveHystoryPlayer1 (или как Вы ее там самостоятельно назовете с помощью аннотации @CollectionTable ).  Т.е. я думаю, для извлечения ArrayList<String> Вам нужен еще один запрос.

п.с. юзайте HQL. 



Это сообщение отредактировал(а) Vasay - 12.6.2012, 02:40


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  12.6.2012,  02:37 Найти цитируемый пост)
Думаю, нужно еще добавить аннотацию @ElementCollection и можно добавить @CollectionTable
 - думаете, или нужно? smile



Цитата(Vasay @  12.6.2012,  02:37 Найти цитируемый пост)
Так.  Вы пытаетесь выполнить SQL (а не HQL )  запрос (а почему бы не HQL?). 
Тогда смотрите: http://docs.jboss.org/hibernate/orm/3.3/re...l/querysql.html
В этом случае Hibernate понятия не имеет что Вы там извлекаете с помощью SQL и возвращает List of Object arrays (Object[])
 - ну да sql. ну так зачем тогда этот sql если хибер понятия не имеет? Можно рабочий пример? У всех туториалах пишет именно так! тем более здесь стоит три метода с помощью которых можно извлекать данные. http://habrahabr.ru/post/132385/  почему у меня елементарный вопрос не получается?! :( Тем более Когда пробовал выдрать оттуда обычный string такая же фигня. :(


Цитата(Vasay @  12.6.2012,  02:37 Найти цитируемый пост)
Как я понимаю
Object[] в Вашем случае содержит один элемент (так как Вы запрашиваете только moveHystoryPlayer1).  И, я думаю, это будет одно число - id по которому таблица games связана с таблицей 
 - да, 1 элемент. но в нем до сотни int значений.

Цитата(Vasay @  12.6.2012,  02:37 Найти цитируемый пост)
Т.е. я думаю, для извлечения ArrayList<String> Вам нужен еще один запрос.
 - какой? Бррр, мне кажется все просто для знающих людей. Почему не поделится строчкой кода? :( Это все что в данный момент мне нужно... :(

Спасибо!

PM MAIL   Вверх
Vasay
Дата 12.6.2012, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  12.6.2012,  10:29 Найти цитируемый пост)
- думаете, или нужно?


Вообще нужно. Но если у Вас нет ошибок и записи добавляются в базу - то, возможно, Hibernate сам додумался что у Вас тут коллекция.  И создал дополнительные таблицы ( А создал? )


Цитата(Killer_13 @  12.6.2012,  10:29 Найти цитируемый пост)
 - ну да sql. ну так зачем тогда этот sql если хибер понятия не имеет? 

Потому что применение SQL в Hibernate - это крайний вариант, применяемый, когда нужно использовать специфические для конкретной БД возможности. В Вашем случае он не актуален. Используйте HQL

 
Цитата(Killer_13 @  12.6.2012,  10:29 Найти цитируемый пост)
 - да, 1 элемент. но в нем до сотни int значений.

Тогда не знаю что он Вам там извлекает. 




Цитата(Killer_13 @  12.6.2012,  10:29 Найти цитируемый пост)
 - какой? Бррр, мне кажется все просто для знающих людей. Почему не поделится строчкой кода?


Ну добавьте аннотацию @ElementCollection для коллекций. 
И используйте HQL 

Примерно такой код должен быть:
Код

Query query = session.createQuery("from SaveParams where serverName = :sName ");
query.setParameter("sName", serverName);
List listOfSaveParams = query.list();


Должны получить List SaveParams удовлетворяющих условию по serverName. 

Извлекаете конкретный элемент из List, затем list MoveHystoryPlayer1

ArrayList moveHystoryPlayer1 = ((SaveParams)listOfSaveParams.get( номер элемента )).getMoveHystoryPlayer1() 


п.с. писал на коленке, так что извините, если где что-то не то написал. 

Это сообщение отредактировал(а) Vasay - 12.6.2012, 11:39


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
Вообще нужно. Но если у Вас нет ошибок и записи добавляются в базу - то, возможно, Hibernate сам додумался что у Вас тут коллекция.  И создал дополнительные таблицы ( А создал? )
 - нет. не создал, только одна таблица.

Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
Потому что применение SQL в Hibernate - это крайний вариант, применяемый, когда нужно использовать специфические для конкретной БД возможности. В Вашем случае он не актуален. Используйте HQL
 - понял



Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
Тогда не знаю что он Вам там извлекает. 
 - :(



Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
Должны получить List SaveParams удовлетворяющих условию по serverName. 
 - тоисть должен получится в итоге объект saveparams со всеми полями.?



Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
Извлекаете конкретный элемент из List, затем list MoveHystoryPlayer1

ArrayList moveHystoryPlayer1 = ((SaveParams)listOfSaveParams.get( номер элемента )).getMoveHystoryPlayer1() 
 - предельно ясно, осталось протестировать. Гррр, сейчас жаль не могу. на работе..

Цитата(Vasay @  12.6.2012,  11:33 Найти цитируемый пост)
п.с. писал на коленке, так что извините, если где что-то не то написал. 
 - ну что Вы, очень выручаете. и за это спасибо!

PM MAIL   Вверх
Vasay
Дата 12.6.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  12.6.2012,  11:48 Найти цитируемый пост)
 - нет. не создал, только одна таблица.


Должны быть созданы таблицы для ArrayList-ов.  Они не создались, наверно, потому что не было аннотации @ElementCollection


Цитата(Killer_13 @  12.6.2012,  11:48 Найти цитируемый пост)
- тоисть должен получится в итоге объект saveparams со всеми полями.?

да

up 
Но если будете использовать  lazy loading (по умолчанию включена) то List-ы будут загружаться только при обращении к ним.

Это сообщение отредактировал(а) Vasay - 12.6.2012, 12:16


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  12.6.2012,  12:02 Найти цитируемый пост)
Должны быть созданы таблицы для ArrayList-ов.  Они не создались, наверно, потому что не было аннотации @ElementCollection
 - хммм, странно в MySql консоли ArrayList печатается на ура. Ок, аннотацию добавлю.
 

Цитата(Vasay @  12.6.2012,  12:02 Найти цитируемый пост)
up 
Но если будете использовать  lazy loading (по умолчанию включена) то List-ы будут загружаться только при обращении к ним.
 - да мне хоть как бы. сейчас нету времени ковырять хибер, и так не хочется задавать такие вопросы, ведь к этому самому легко придти, - главное покурить основы... но.. сессия на носу, кроме проекта, много теории учить, так что выковыриваю данные. дописываю загрузку из этих данных и все.


иии, если можно - для меня остался один неясный вопрос..
Цитата

И как можно сохранить объект boardMatrix? В нем 144 значения Integer. Hibernate говорит, что значение сл велико для одной колонки. :(


Пас.

PM MAIL   Вверх
Vasay
Дата 12.6.2012, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  12.6.2012,  13:10 Найти цитируемый пост)
 - хммм, странно в MySql консоли ArrayList печатается на ура. Ок, аннотацию добавлю.


Как они могут печататься, если для их хранения не создано таблиц?


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  12.6.2012,  14:30 Найти цитируемый пост)
Как они могут печататься, если для их хранения не создано таблиц? 
 - нууу, не знаю.. выводит первый элемент -> второй элемент -> третий элемент -> ....

Добавлено через 19 секунд
Конфиг и класс я выложил.
PM MAIL   Вверх
Vasay
Дата 12.6.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  12.6.2012,  14:35 Найти цитируемый пост)
 - нууу, не знаю.. выводит первый элемент -> второй элемент -> третий элемент -> ....



А что у Вас в БД? Если таблица только одна, то, наверно, там просто дублируются записи для каждого значения в коллекции.

Добавлено @ 14:49
Цитата(Killer_13 @  12.6.2012,  13:10 Найти цитируемый пост)
И как можно сохранить объект boardMatrix? В нем 144 значения Integer. Hibernate говорит, что значение сл велико для одной колонки. :(


Что из себя представляет boardMatrix ? Двумерный массив 12х12 ?

Это сообщение отредактировал(а) Vasay - 12.6.2012, 14:50


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vasay @  12.6.2012,  14:47 Найти цитируемый пост)
А что у Вас в БД? Если таблица только одна, то, наверно, там просто дублируются записи для каждого значения в коллекции.
 - ничего, только это, я травлю хибер на пустую базу и он мне создает эту таблицу.



Цитата(Vasay @  12.6.2012,  14:47 Найти цитируемый пост)
Что из себя представляет boardMatrix ? Двумерный массив 12х12 ?
 - да. мене посоветовали кастовать в строку, и заганять в базу как строку. Делал как строку. но в итоге лажа получается, так как разные числа, и плюс и минус и нули и так д... Поэтому запихнул все в ArrayList.

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

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



Цитата(Killer_13 @  12.6.2012,  14:58 Найти цитируемый пост)
 - ничего, только это, я травлю хибер на пустую базу и он мне создает эту таблицу.


Так что туда записывается? Как записывается Ваши ArrayList-ы, что Вы потом их извлекаете (то что таблица только одна - это не правильно). 


Цитата(Killer_13 @  12.6.2012,  14:58 Найти цитируемый пост)
- да. мене посоветовали кастовать в строку, и заганять в базу как строку. Делал как строку. но в итоге лажа получается, так как разные числа, и плюс и минус и нули и так д... Поэтому запихнул все в ArrayList.


как строку - не надо. ArrayList, пожалуй, правильно.  Не записывается, наверно, потому что не правильно что-то сконфигурировали.  Покажите код. 


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Killer_13
Дата 12.6.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


 




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


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

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