2017-07-31 90 views
0

我想选择任何具有新状态栏的Foo实体。春季数据CrudRepository findBy关系

这里是我的尝试:

@Entity 
@Table(name = "FOO") 
class Foo { 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany 
    private Set<Bar> bars; 

    //... 
} 



public interface FooRepository extends CrudRepository<Foo, Long> { 


    @Query("select m from Foo f where f.bars.status = 'NEW' ") 
    public Page<Foo> findByBarStatus(Pageable pageable); 

} 

,但我得到:

org.hibernate.exception.SQLGrammarException: could not prepare statement 

我也试着写连接语句代替:

select f from Foo f inner join f.bars b where b.status = 'NEW' 

回答

1
SELECT f FROM Foo AS f JOIN f.bars AS b WHERE b.status = 'NEW' 
+0

您忘记'AS's – Snickers3192

+0

'因为'不是强制性的。 –

+2

@AbdullahKhan你只是吹我的脑海里。 – Snickers3192

1

我觉得你缺少这样的东西

@OneToMany(mappedBy = "foo") 
private Set<Bar> bars; 
1

加入一对多关系有时可能会非常棘手。 (还有一个答案是正确的,你可以参考)

在这种情况下,你可以通过从Bar侧查找相反(假设你有关系是双向的):

select bar.foo from Bar bar where bar.status = 'NEW' 
+0

其实我也失踪'@JoinColumn(name =“酒吧”)' – Benedictus

+0

@Benedictus它不一定是“失踪”,因为Hibernate可以推断列名(虽然名字可能不是你想要的) –

+0

那么它没”以任何其他方式为我工作 – Benedictus