Неверный спящий SQL-запрос: ElementCollection включен в качестве столбца - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть это поле в классе Entity, который является коллекцией строк:

...
@ElementCollection(fetch=FetchType.EAGER)
@JoinTable(name="wifi_network_config_auth_algorithm")
@JoinColumn(name="wifi_network_config_id", referencedColumnName="id")
private ArrayList<String> authAlgorithm = new ArrayList<String>();

public List<String> getAuthAlgorithm() {
    return authAlgorithm;
}

public void setAuthAlgorithm(ArrayList<String> authAlgorithm) {
    this.authAlgorithm = authAlgorithm;
}
...

Когда я использую HibernateTemplate.find ("from wifi_network_config"), генерируется приведенный ниже запрос, который вызывает исключение SQLGrammarException, поскольку столбец, соответствующий полю 'authAlgorithm', отсутствует в таблице базы данных. Поскольку authAlgorithm является коллекцией, его не следует включать в запрос.

2012-02-16 10:11:56,365 WARN - <SQL Error: 1054, SQLState: 42S22>
2012-02-16 10:11:56,366 ERROR - <Unknown column 'wifinetwor0_.authAlgorithm' in 'field list'>
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [select wifinetwor0_.id as id0_, wifinetwor0_.ssid as ssid0_, wifinetwor0_.priority as priority0_, wifinetwor0_.auth_algorithms as auth4_0_, wifinetwor0_.group_cipher as group5_0_, wifinetwor0_.key_management as key6_0_, wifinetwor0_.pairwise_cipher as pairwise7_0_, wifinetwor0_.protocol as protocol0_, wifinetwor0_.vpn_type as vpn9_0_, wifinetwor0_.vpn_url as vpn10_0_, wifinetwor0_.authAlgorithm as authAlg11_0_ from wifi_network_config wifinetwor0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
        at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:629)
        at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
        at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
        at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
        at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:904)

База данных MySql. Это работает в небольшой тестовой программе, которая работает с hsqldb.

Спасибо, Хари

1 Ответ

1 голос
/ 17 февраля 2012

Вы не можете объявить постоянную коллекцию как ArrayList. Вместо этого вы должны использовать интерфейс: List. Hibernate должен заменить вашу фактическую коллекцию коллекцией, специфичной для Hibernate (которая реализует List).

В целом, рекомендуется программировать на интерфейсы, а не на реализации. При использовании Hibernate или JPA, это безумно.

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