Я столкнулся с проблемой того, как использовать SQL "in" в массовом обновлении Hibernate.
Пример:
Страна относится к типу enum.
Обычный оператор SQL
Update Persons SET country = Country.China
WHERE country IN (Country.HK, Country.Taiwan);
Спящий режим с использованием DetachedCriteria
DetachedCriteria criteria= DetachedCriteria.forClass(Persons.class)
.add(Property.forName("country").in(countryList));
List<Persons> personsList = getHibernateTemplate().findByCriteria(criteria);
for(Persons persons : personsList){
person.setCountry(Country.China);
}
personsDao.updateAll(personsList);
personsDao.flush();
Режим гибернации с использованием объемного обновления - не работает!
getHibernateTemplate().bulkUpdate(
"select * from Persons where country in (?)",
new Object[] {countryList});
Сообщение об ошибке:
[Lcom.model.Persons.Country; cannot be cast to java.lang.Enum]
Но я попробовал это. Оно работает.
[Не используя объект: я жестко его кодирую]
getHibernateTemplate().bulkUpdate(
"select * from Persons where country in (" + Country.HK + "," + Country.Taiwan +" )" );
Здесь вопрос:
1. Можем ли мы использовать Object [] с предложением «in»?
2. Интересно, почему система знает, что Объект является Перечислением Страны.
Пример:
getHibernateTemplate().bulkUpdate(
"select * from Persons where country = ?",
new Object[] {country});
==> Это рабочий и исполняемый файл.
- Кроме коллекции Enum (пример выше), List или String [] также не работают, используя Object с предложением «in».
Надеюсь, вы, ребята, сможете решить мою проблему.
Благодарю.
-fsloke