Как преобразовать объект запроса в список строк?

#java #sql #arraylist

#java #sql #arraylist

Вопрос:

Я получил класс входа в систему:

 if((!(name.equals(null) || name.equals("")) amp;amp; !(password.equals(null) ||  password.equals(""))))
        {
            try{
                loggedUser = checkLogin(name, hexPass.toString());

                if(!loggedUser.isEmpty())
                {
                    userdbId = loggedUser.get(0);
                    userdbName = loggedUser.get(1);
                    userdbPsw = loggedUser.get(2);
                    userdbType = loggedUser.get(3);

                    ...
  

И пользовательский DAO:

 public List<String> checkLogin(String uname, String password) {
    Session session = null;
    List<String> lst = new ArrayList<String>();
    try {
        session = getSession();
        String sql = "select * from user where uname='"   uname   "' and password='"   password   "'";
        Query query = session.createSQLQuery(sql)
                .addScalar("Id", StringType.INSTANCE)
                .addScalar("uname", StringType.INSTANCE) 
                .addScalar("password", StringType.INSTANCE) 
                .addScalar("utype", StringType.INSTANCE);
        lst = query.list();
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return lst;
}
  

userdbId = loggedUser.get(0); генерирует ошибку: 500

 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.String
com.se.pl.actions.LoginAction.execute(LoginAction.java:95)
  

Я не понимаю, почему это происходит, поскольку список из 4 строк будет помещен в 4 переменные.

Комментарии:

1. С помощью этого кода вы получите не список строк, а список объектов с четырьмя свойствами.

2. Не могли бы вы рассказать нам, используете ли вы ORM framework, и если используете, то какой тип и версию?

3. Можете ли вы дать мне совет о том, как заставить это работать должным образом? Я программист-новичок.

4. @fallenPhantasm Я не использую этот фреймворк

5. кажется, вы используете Hibernate ORM framework

Ответ №1:

Ошибка означает, что у вас есть объект, и вы выполняете неявное приведение к строке, так что это ошибка.

 userdbId = loggedUser.get(0);
  

Вы можете исправить это, добавив метод toString(), например:

 userdbId = loggedUser.get(0).toString();
  

Конечно, вы получите строковое представление для этого объекта.

Обратите внимание, что если у вас есть свой собственный объект, вы получите следующее представление:

 getClass().getName()   '@'   Integer.toHexString(hashCode())
  

В случае, если у вас есть это, вам нужно будет переопределить toString() метод в вашем классе

Комментарии:

1. userdbId = loggedUser.get(0).toString(); не работает, потому что пользователь вложен в первый объект в списке, и я не могу получить к нему доступ.

Ответ №2:

Вы должны использовать TypedQuery<T> вместо запроса и создавать объекты типа user entity (если он у вас определен — он обязательно должен быть) — это должно выглядеть примерно так (не воспринимайте этот код буквально! Я в основном использую OpenJPA)

 TypedQuery<UserEntity> query= session.createQuery("SELECT u FROM UserEntity u WHERE name=:name AND password=:password");
query.addParam("name",name);
query.addParam("password",password);
  

Ответ №3:

Это, вероятно, должно помочь:

 Query query = session.createSQLQuery(sql)
                .addScalar("Id", StringType.INSTANCE)
                .addScalar("uname", StringType.INSTANCE) 
                .addScalar("password", StringType.INSTANCE) 
                .addScalar("utype", StringType.INSTANCE)
                .setResultTransformer(org.hibernate.Criteria.ALIAS_TO_ENTITY_MAP);

Map row = (Map) query.uniqueResult();
lst.add((String) row.get("Id"));
lst.add((String) row.get("uname"));
lst.add((String) row.get("password"));
lst.add((String) row.get("utype"));
  

Комментарии:

1. Я получаю следующую ошибку: (java.lang. ClassCastException) java.lang. ClassCastException: [Ljava.lang. Объект; не может быть приведен к java.util.Map

2. @TheKolanN Я добавил .setResultTransformer(org.hibernate.Criteria.ALIAS_TO_ENTITY_MAP); , пожалуйста, попробуйте еще раз