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

时间:2016-01-28 12:12:20

标签: java mysql hibernate

我有以下表格: 援助 B:id,文字 AB:aID,bID

我想念念A和B,其中B.text包含单词'cat'。

这是我做的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;

}

1 个答案:

答案 0 :(得分:1)

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

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中的外键进行关联。