#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);
, пожалуйста, попробуйте еще раз