我有下表: 援助 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/