2014-12-29 4 views
0

Привет, я разрабатываю веб-приложение с использованием весны mvc 3 и hibernate 4. Я использую аннотации для всех конфигураций.Получение неожиданного токена ERROR в Hibernate 4

При попытке выбрать объект, я получаю ошибку:

DaoException: unexpected token: MEMBER near line 1, column 37 [from clanwar.model.ClanMember where MEMBER = :member] 
at clanwar.dao.impl.ClanMemberDao.findByPlayerId(ClanMemberDao.java:71) 

Если я делаю запрос с .createSQLQuery() спящего режима вернуть мне Object[] экземпляр ClanMember лица.

метод в DAO:

@Repository 
    @Transactional 

    ... 

    @Override 
    public ClanMember findByPlayerId(int id) throws DaoException { 

     ClanMember foundMember; 

     try { 
      foundMember = (ClanMember) getSession() 
       .createQuery("from ClanMember where MEMBER = :member") 
       .setParameter("member", id) 
       .uniqueResult(); 
     } catch (Exception e) { 
      throw new DaoException(e.getMessage()); 
     } 

     return foundMember; 
    } 

    ... 

Entity:

@Entity 
@Table(name = "CLAN_MEMBERS") 
public class ClanMember implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "CLAN") 
    private Clan clan; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "MEMBER") 
    private Player member; 

    @ManyToOne 
    @JoinColumn(name = "ROLE") 
    private ClanRole role; 

    public ClanMember() {} 

    // Setters and getters 

} 

Таблица CLAN_MEMBERS:

+--------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+--------+---------+------+-----+---------+-------+ 
| CLAN | int(11) | NO | PRI | NULL |  | 
| MEMBER | int(11) | NO | PRI | NULL |  | 
| ROLE | int(11) | NO |  | 1  |  | 
+--------+---------+------+-----+---------+-------+ 

Что я делаю неправильно? Спасибо заранее.

+0

использовать Try псевдоним 'от ClanMember см, где cm.member.id =: member' –

ответ

0

member является зарезервированным словом в HQL. Удалите его, добавив псевдоним таблицы.

Кроме того, поскольку member имеет тип Player, когда ваш where clause содержит member вам необходимо предоставить параметр типа Player. Кроме того, если вы хотите предоставить удостоверение личности, как вы делаете, вы должны явно искать id:

Так что либо:

foundMember = (ClanMember) getSession() 
      .createQuery("from ClanMember c where c.member = :member") 
      .setParameter("member", someInstanceOfPlayer); 
      .uniqueResult(); 

или

foundMember = (ClanMember) getSession() 
      .createQuery("from ClanMember c where c.member = :member") 
      .setParameter("member", idOfAPlayer); 
      .uniqueResult(); 
+0

Большое спасибо, я не знаю, что член является зарезервированным словом. Я добавляю псевдоним и все работает (я получаю еще одно исключение, но это другой aswer). Спасибо @ geert3 – Arturo

0

Ваш запрос должен быть как следующее:

from ClanMember where member = :member 

Поэтому ваш код, чтобы получить элемент должен выглядеть следующим образом:

foundMember = (ClanMember) getSession() 
       .createQuery("from ClanMember where member = :member") 
       .setParameter("member", id) 
       .uniqueResult(); 

А также обратите внимание, что id, которые вы передаете должен быть экземпляром Player класс.

+0

Этот запрос похож на мой запрос, но с членом-членом. (Только верхний регистр может вывести эту ошибку). Я меняюсь, и я получаю ту же ошибку. @DarshanLila – Arturo

+0

member - это поле вашего класса в спящем режиме, вам нужно использовать это, а не столбцы таблицы при написании запроса. –

+0

Я обновил свой ответ. –

Смежные вопросы