java - hibernate createAlias with 子句生成错误的查询

标签 java mysql hibernate

我有下表: 援助 B: id, 文本 AB: aID, bID

我想连接 A 和 B,其中 B.text 包含单词“猫”。

这是我执行的 hibernate 查询:

Criteria c = session.createCriteria(TableA.class, "A");
c.createAlias("A.bs", "B", JoinType.INNER_JOIN, Restrictions.like("b.text", "%cat%"));
c.setProjection(Projections.property("id"));

生成的查询是:

Select id 
FROM A a
INNER JOIN AB ab ON a.id=ab.aID AND (b.text like ?)
INNER JOIN B b ON b.id=ab.bID AND (b.text like ?)

出于某种原因 AND (b.text like ?) 出现在两个内部连接中。据我所知,它应该只在第二个。 这会导致以下异常:

java.sql.SQLException: No value specified for parameter 2

我猜这是因为它只有一个参数和两个“?”。

我错过了什么?

编辑:

添加持久类:

@Entity
@Table(name="A")
Class A {

    @Id
    @Column(name="id", length=255)
    protected String id;

    @OneToMany
    @JoinTable(name="AB", joinColumns = @JoinColumn( name="aID"), inverseJoinColumns = @JoinColumn( name="bID"))
    @LazyCollection(LazyCollectionOption.FALSE)
    protected List<B> bs;

}

@Entity
@Table(name="B")
Class B {

    @Id
    @Column(name="id", length=255)
    protected String id;

    @Column(name="text", length=255)
    protected String text;

}

最佳答案

我认为你需要创建一个别名

c.createAlias("A.bs", "b", JoinType.INNER_JOIN, Restrictions.like("b.text", "%cat%"));

已更新

我认为这是一个 Hibernate 错误。您可以通过在 where 子句中使用限制来修复它

 c.createAlias("A.bs", "b", JoinType.INNER_JOIN);
 c.add(Restrictions.like("b.text", "%cat%"));

或者在B中不使用连接表,通过外键进行关联。

关于java - hibernate createAlias with 子句生成错误的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35061168/

相关文章:

java - 将 WAR 部署到 WildFly 11 时出现奇怪的 ClassCastException

java - 磁盘上的 JackRabbit 存储库

MySQL连接查询混淆

java - JDBC准备好的语句/引用另一个准备好的语句中的准备好的语句

java - 使用 Hibernate 仅更新特定列

java - 使用 Spring MVC、JPA 和 Hibernate 添加 ManyToMany

java - 实体、服务类和命令对象的最佳实践问题

java - 锁和嵌套的同步方法

Java 允许 XSS 过滤器异常(exception)

mysql - 使用左连接从多个表中获取计数