java - 在 Hibernate 4 中获取错误意外 token

标签 java mysql spring hibernate

您好,我正在使用 spring mvc 3 和 hibernate 4 开发一个 Web 应用程序。我对所有配置都使用注释。

当我尝试选择一个实体时,出现错误:

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() 进行查询,hibernate 会返回一个 ClanMember 实体的 Object[] 实例。

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
@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       |       |
+--------+---------+------+-----+---------+-------+

我做错了什么? 提前致谢。

最佳答案

member 是 HQL 中的保留字。通过添加表别名来转义它。

此外,由于 member 的类型为 Player,因此当您的 where 子句 包含 member 时,您需要提供Player 类型的参数。或者,如果您想像现在一样提供 ID,则需要显式搜索 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();

关于java - 在 Hibernate 4 中获取错误意外 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27688366/

相关文章:

java - Spring @Scheduled 在 @Configuration 类中

java - 如何使用 ServletContextPropertyPlaceholderConfigurer 中从数据库加载的属性覆盖从文件加载的属性?

java - 为什么 Hibernate 认为 @GeneratedValue 从根本上是错误的?

java - MyBatis 未在映射文件中加载 Oracle SYSDATE

mysql - SQL中的SHOW语句吗?

php - SQL,如何按已知值获取在另一列中具有相同值的行?

java - 为什么我的 java 代码不能运行?

java - Google App Engine - 带有调度程序 Servlet 的 Blob 存储服务

mysql - 查询单个表作为主表和详细信息并对结果进行排序,其中主行将位于每个详细信息的顶部

java - 用于异步客户端到客户端消息传递的库