Java Hibernate SQLGrammarException:无法准备语句…列“;非「;找不到

Java Hibernate SQLGrammarException:无法准备语句…列“;非「;找不到,java,sql,hibernate,hql,Java,Sql,Hibernate,Hql,我有以下代码: @Entity @Table(name = "terminal_admin") public class TerminalAdmin { @ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL) @JoinTable(name = "admin_role", joinColumns = { @JoinColumn(name = "admin_id", nullable =

我有以下代码:

@Entity
@Table(name = "terminal_admin")
public class TerminalAdmin {
        @ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinTable(name = "admin_role", joinColumns = { 
            @JoinColumn(name = "admin_id", nullable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "role_id", 
                    nullable = false) })
   private Set<AdminRole> adminRoles;
}
terminalAdminService.findAdminByRoles(Arrays.asList(new AdminRole("TERMINAL_MODERATOR"),
                        new AdminRole("MODERATOR"),
                        new AdminRole("SUPERADMIN")))




public List<TerminalAdmin> findAdminByRoles(List<AdminRole> roles) {
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery("from TerminalAdmin where adminRoles in :roles");
        query.setParameter("roles", roles);
        return query.list();
    }
我执行以下代码:

@Entity
@Table(name = "terminal_admin")
public class TerminalAdmin {
        @ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinTable(name = "admin_role", joinColumns = { 
            @JoinColumn(name = "admin_id", nullable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "role_id", 
                    nullable = false) })
   private Set<AdminRole> adminRoles;
}
terminalAdminService.findAdminByRoles(Arrays.asList(new AdminRole("TERMINAL_MODERATOR"),
                        new AdminRole("MODERATOR"),
                        new AdminRole("SUPERADMIN")))




public List<TerminalAdmin> findAdminByRoles(List<AdminRole> roles) {
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery("from TerminalAdmin where adminRoles in :roles");
        query.setParameter("roles", roles);
        return query.list();
    }

如何修复它?

您正在直接尝试按对象进行筛选,我不确定这是否可行。您应该尝试在查询中使用
join
。比如:

from TableAdmin ta left join ta.adminRoles ar where ar.id in :roleIds
并将实际ID作为参数传递。

此查询正在运行:

from TerminalAdmin ta left join ta.adminRoles ar where ar.role in (:roles)

对于此查询-
角色
应该是字符串列表

罪魁祸首
非限定属性引用
。找不到它的来源。@redflar3我看到了这一点,但我不知道这是什么意思我猜测发生了错误,因为您要求hibernate比较两个对象(类型为
AdminRoles
)。。不确定hibernate是否能做到。。因此,它将
HQL
中的
adminRoles
描述为
非限定属性ref
。@redflar3如何修复它?您可以尝试使用
join
,如
Danail Alexiev
所述,从TerminalAdmin ta left join ta.adminRoles ar where ar.role in(:roles)您没有提供连接路径