【问题标题】:Spring data CrudRepository findBy relationshipsSpring数据CrudRepository findBy关系
【发布时间】:2018-01-07 14:42:41
【问题描述】:

我想选择所有 Foo 实体,它们的任何 Bars 都具有新状态。

这是我尝试过的:

@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

我也尝试过编写 join 语句:

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

【问题讨论】:

    标签: java sql spring spring-data spring-data-jpa


    【解决方案1】:
    SELECT f FROM Foo AS f JOIN f.bars AS b WHERE b.status = 'NEW'
    

    【讨论】:

    • 你忘记了“AS”
    【解决方案2】:

    我认为你缺少这样的东西

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

    【讨论】:

      【解决方案3】:

      加入一对多关系有时会很棘手。 (还有另一个答案做得对,你可以参考)

      在这种情况下,您可以通过从Bar 一侧向上查找来反向执行(假设您的关系是双向的):

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

      【讨论】:

      • 其实我也错过了@JoinColumn(name = "Bar")
      • @Benedictus 它不一定是“丢失”,因为 Hibernate 可以推断出列名(尽管名称可能不是你想要的)
      猜你喜欢
      • 2018-01-07
      • 2018-06-02
      • 2012-08-24
      • 1970-01-01
      • 2018-07-15
      • 2017-03-25
      • 2018-05-26
      • 2020-03-09
      • 2018-06-10
      相关资源
      最近更新 更多