简体   繁体   English

在Hibernate 4中获取错误意外令牌

[英]Getting ERROR unexpected token in Hibernate 4

Hi I developing a web app using spring mvc 3 and hibernate 4. I'm using annotations for all config. 嗨,我使用Spring MVC 3和Hibernate 4开发了一个Web应用程序。我对所有配置都使用了注释。

When I try to select a entity I get an error: 当我尝试选择一个实体时出现错误:

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)

If I do the query with .createSQLQuery() hibernate return me an Object[] instance of ClanMember entity. 如果我使用.createSQLQuery()休眠进行查询, .createSQLQuery() ClanMember实体的Object[]实例返回给我。

Method in DAO: 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

}

Table CLAN_MEMBERS: 表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       |       |
+--------+---------+------+-----+---------+-------+

What I'm doing wrong? 我做错了什么? Thanks in advance. 提前致谢。

Your query should be like following: 您的查询应如下所示:

from ClanMember where member = :member

Therefore your code to get member should look like following: 因此,获取成员的代码应如下所示:

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

And also note that id which you pass should be an instance of Player class. 还要注意,传递的id应该是Player类的实例。

member is a reserved word in HQL. member是HQL中的保留字。 Escape it by adding a table alias. 通过添加表别名对其进行转义。

Also, since member is of type Player , when your where clause contains member you need to provide a parameter of type Player . 另外,由于member的类型为Player ,因此当where clause包含member您需要提供Player类型的参数。 Alternatively if you want to provide the ID as you're doing, you need to explicitly search for the id : 另外,如果您想在执行操作时提供ID,则需要显式搜索id

So either: 所以:

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

or 要么

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM