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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несоответствие типов, java.lang.ClassCastException 
V
    Опции темы
Exai1e
Дата 11.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте, возникла такая проблема:
есть метод
Код

    public List<User> GetUserList() {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();        

        List<User> userList = (List<User>) session.createSQLQuery("select * from users").list();
        
        session.getTransaction().commit();
        return userList;
    }


использую:
Код

        List<User> userList = dao.GetUserList();
        for (User curUser : userList) {

            System.out.println("id: " + curUser.GetUserID());
            System.out.println("name: " + curUser.GetUserName());
            System.out.println("surname: " + curUser.GetUserSurname());
            System.out.println("groupid: " + curUser.GetUserGroupID());
            System.out.println();
        }


получаю исключение:
Код

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to testdbapp.User


если делать так:
Код

    public List<User> GetUserList() {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();        

        List<User> userList = session.createCriteria(User.class).list();
        
        session.getTransaction().commit();
        return userList;
    }

то работает, но получается, что определенный запрос задать не получиться (where... orderby...)
В статье Антона Сабурова, нечего хитрого на этот счет не увидел. 
Подскажите как правильно сделать, спасибо.

ps. еще один не большой вопрос, на тему hibernate, не стал делать новую тему:
почему если делать так:
Код

        List<User>userList = (List<User>) session.createQuery("from users").list();

то выдается исключение на маппинг
Код

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: users is not mapped [from users]
        at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
        at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
        at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
        at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:277)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
        at $Proxy8.createQuery(Unknown Source)
        at testdbapp.MyDAO.GetUserList(MyDAO.java:41)
        at testdbapp.Main.main(Main.java:26)
Java Result: 1

хотя в конфиге класс указан:
Код

        <mapping class="testdbapp.User"/>

еще раз спасибо

Это сообщение отредактировал(а) Exai1e - 11.2.2010, 23:32


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
MaxPayneC
Дата 12.2.2010, 00:30 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

List<User> userList = (List<User>) session.createSQLQuery("select * from users").list();

Метод list() вернет Object[], каждый элемент которого содержит Object[] с полями данной строки датасета, т.к. при использовании нативных запросов придется создавать объекты руками.

Во втором вашем фрагменте кода эксепшн возникает потому, что в методе createQuery нужно писать HQL-запрос, который возможен только над примапленными сущностями. Скорее всего нужно написать в запросе User c большой буквы.

По поводу критерия - и where, и orderBy использовать можно, например так (код из моего текущего проекта):
Код

List admins = session.createCriteria(Administrator.class)
                    .add(Restrictions.eq("login", this.login))
                    .add(Restrictions.eq("passwordHash", Utilities.md5(this.password)))
                    .add(Order.asc("login"))
                    .list();

Этот метод имеет недостаток - лист придется делать без дженерика.
Обращаю ваше внимание, что первым параметром нужно указывать не название колонки, а название примапленного поля в сущности.

Вот тут можно почитать про критерии в подробностях:
https://www.hibernate.org/hib_docs/v3/api/o...e/Criteria.html

Это сообщение отредактировал(а) MaxPayneC - 12.2.2010, 00:31
PM   Вверх
Exai1e
Дата 12.2.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MaxPayneC, с большой буквы, тоже не помогло:
сама таблица вот:
Код

        String queryUser = "CREATE TABLE users (" +
                " userid int(10) NOT NULL auto_increment," +
                " username varchar(25)," +
                " usersurname varchar(25)," +
                " usergroupid int(10)," +
                " PRIMARY KEY (userid)" +
                " )";


сам класс User:
Код

@Entity
@Table(name="users")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="userid")
    private int userID;
    public void SetUserID(int pID) {
        this.userID = pID;
    }

    public int GetUserID() {
        return this.userID;
    }

    @Column(name="username")
    private String userName;
    public void SetUserName(String pUserName) {
        this.userName = pUserName;
    }

    public String GetUserName() {
        return this.userName;
    }

    @Column(name="usersurname")
    private String userSurname;
    public void SetUserSurname(String pUserSurname) {
        this.userSurname = pUserSurname;
    }

    public String GetUserSurname() {
        return this.userSurname;
    }

    @Column(name="usergroupid")
    private int userGroupID;
    public void SetUserGroupID(int pUserGroupID) {
        this.userGroupID = pUserGroupID;
    }
    
    public int GetUserGroupID() {
        return this.userGroupID;
    }
}


Цитата(MaxPayneC @  12.2.2010,  00:30 Найти цитируемый пост)

Метод list() вернет Object[], каждый элемент которого содержит Object[] с полями данной строки датасета, т.к. при использовании нативных запросов придется создавать объекты руками.

можно пример ? что возвращает Object[], это я заметил.

Цитата(MaxPayneC @  12.2.2010,  00:30 Найти цитируемый пост)
По поводу критерия - и where, и orderBy использовать можно, например так (код из моего текущего проекта):

Спасибо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
MaxPayneC
Дата 12.2.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В маппинге у вас ошибка. Чтобы работало, надо следовать спецификациям JavaBeans об именах - геттеры и сеттеры для поля variableName должны иметь название getVariableName/setVariableName (с маленькой буквы, а название переменной в имени сеттера - с большой).

Код

List l = s.createSQLQuery("select * from list_cities").list();

В таблице list_cities три поля, и каждая строка листа будет содержать Object[] c тремя элементами этой строки датасета в том порядке, в котором указаны в таблице (код кривоват, но для понимания что получим от createSQLQuery думаю сгодится):
Код

for (Iterator it = l.iterator(); it.hasNext(); )
{
     Object[] row = (Object[]) it.next();
     City c = new City();
     c.setId((Integer)row[0]);
     c.setName((String) row[1]);
}

А с HQL-запросом будет так:
Код

List l = s.createQuery("from City").list();

И вот тут в списке будут лежать уже объекты City.

Это сообщение отредактировал(а) MaxPayneC - 12.2.2010, 08:21
PM   Вверх
Exai1e
Дата 12.2.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MaxPayneC, спасибо большое  smile , все работает. просто первый раз с ORM сталкиваюсь


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

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

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


 




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


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

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