почему элемент в моем списке <Integer>имеет тип Character? - PullRequest
0 голосов
/ 22 января 2020

enter image description here

Как показано на рисунке выше, мой метод принимает список ListDays, и я ожидаю, что элемент имеет тип Integer, but why in debug mode, I find that the element is of type Символ?

includeDays происходит от следующего кода:

List<Integer> includedDays = getDowByTrmClassId(trmClassId);

и getDowByTrmClassId(trmClassId) определяется как:

List<Integer> getDowByTrmClassId(Integer trmClassId){
    Session session = HibernateUtil.getCurrentSession();
    String sql = " select DOW from TRM_CLASS_DOW cdow " + 
            "where (cdow.UPDATE_MODE is null or cdow.UPDATE_MODE <> 'D') " + 
            " AND cdow.TRM_CLASS_ID = :trmClassId  " + 
            " ORDER BY cdow.dow";
    Query sqlQuery = session.createSQLQuery(sql);
    sqlQuery.setParameter("trmClassId", trmClassId);        
    List<Integer> classDows = sqlQuery.list();
    return classDows;       
}

столбец dow имеет тип varchar(1)

1 Ответ

0 голосов
/ 31 января 2020

Я думаю, что это виновник вашей проблемы.

the column dow is of type varchar(1)

Varchar должен вернуть строковый результат для этого поля. Но я обнаружил, что у hibernate есть некоторая проблема: когда varchar содержит один символ, результат будет преобразован в тип данных char / Character в вашем Java. Посмотрите на эти проблемы, HHH-2220 , HHH-2304 и другие с той же проблемой. Здесь указано здесь , и я цитирую

В настоящее время Hibernate поддерживает своего рода отображение "automagi c" из типов SQL в типы Hibernate / Java - потому что из многих двусмысленностей, возникающих при таком отображении, оно иногда не будет соответствовать тому, что вы на самом деле хотите.

Предложение: Поскольку вы действительно ожидаете Символ из-за приведенного выше кода и проблемы, Вы должны исправить проблему типа данных в вашей базе данных и Java. Вы можете окончательно преобразовать свою базу данных в правильный тип данных (целое число, если оно действительно находится в диапазоне от 0 до 9). Или, если вы не можете изменить базу данных, вы можете сделать это, создав вспомогательный класс / метод для ручного анализа каждого результата в Integer, например, используя метод, подобный следующему:

/**
* You parser method of Character to Integer
*/
public List<Integer> converToIngeter(List resultList){//This should accept your resultSet from your query as List
    List<Integer> toReturn  = new ArrayList<>();

    resultList.stream().forEach((o)->{
        if(Character.isDigit((Character) o)){//(Character) o) is just an insurance that the instance is Character
            toReturn.add(Character.getNumericValue((Character)o));
        }
    });


     /* Or you do some other parsing 
      */
     return toReturn;
}

В вашем коде

List<Integer> getDowByTrmClassId(Integer trmClassId){
    . . . //Your other code here
    sqlQuery.setParameter("trmClassId", trmClassId);
    List<Integer> classDows = converToIngeter(sqlQuery.list()); //converToIngeter(list) was added to convert the result to Integer
    return classDows;       
}

Вы можете посмотреть другой символ на целочисленный синтаксический анализ, например здесь в inte rnet.

Или Исправить проблему с типом данных при возвращении Varchar в качестве символов на Java, Этот ответ предлагает добавить .addScalar("PREFIX", Hibernate.STRING); к вашему запросу. Например,

sqlQuery.setParameter("trmClassId", trmClassId);
sqlQuery.addScalar("PREFIX", Hibernate.STRING);

Затем, позже, проанализируйте их в Integer.

==============

ОБНОВЛЕНИЕ :

Удалить несвязанный ответ. Спасибо тебе, Андреас, за то, что указал на некоторые из них, которыми я пренебрегал.

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