【问题标题】:Sorting by relation property按关系属性排序
【发布时间】:2018-01-07 19:13:50
【问题描述】:

这是我的工作数据库设置:

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

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "FOO_ID")
    private Set<Bar> bars;

//...

}

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

    @Column(name = "STATUS")
    private String status;
    //...
}

FooRepository 扩展 CrudRepository {

@Query("select distinct f from Foo f left join f.bars b where b.status = :status ")
public Page<Bar> findByBarStatus(@Param("status") BarStatus status, Pageable pageable);

}

我希望能够按Bar.status 对该查询进行排序,这是我尝试更改查询的方式:

@Query("select distinct f from Foo f left join f.bars b where b.status = :status order by b.status desc")
public Set<Bar> findByBarStatus(@Param("status") BarStatus status);

然而这会导致 sql 语法错误:

org.h2.jdbc.JdbcSQLException: Order by expression "BARS1_.STATUS" must be in the result list in this case;

【问题讨论】:

  • select distinct f, b.status ....

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


【解决方案1】:

在这里,您在 f 上应用了 distinct,因此您不能按顺序排列其他列。实际上,按项目排序必须在选择列表中。

所以,问题出在查询中,如果您确定 f 将是唯一的(但我猜测不是这种情况),您可以删除 distinct,或者您可以尝试 with 子句,

with temp as  
(select distinct f, b.status 
 from Foo f left join f.bars b 
 where b.status = :status order by b.status desc) 
select f from temp

【讨论】:

  • 那没用。 java.lang.IllegalArgumentException:方法查询验证失败
  • 它可以在没有 with 包装器的情况下工作,但会返回两个值。所以我猜包装器中有语法错误
  • 好的.. 我认为您需要在查询注释中设置nativeQuery=true 才能使这项工作。即@Query(nativeQuery = true, value= &lt;&lt;supply-query-string&gt;&gt;)
  • 我实际上想保留 Pageable 和其他一些我认为在本机模式下无法做到的功能
  • 我可以在这种情况下以某种方式使用@SqlResultSetMapping 或者至少将此查询的结果聚合到包装对象中吗?
【解决方案2】:

您必须在查询选择语句中调用b.status,如下查询。

    select DISTINCT(f), b.status from Foo f
 LEFT JOIN f.bars b where b.status = :status order by b.status desc

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2021-10-10
    • 2011-03-23
    相关资源
    最近更新 更多