在@Query中用动态VALUES表示JOIN

时间:2018-03-20 10:23:43

标签: spring hibernate spring-data spring-data-jpa

以下查询来自this answer。唯一的区别是我需要匹配包含我必须过滤的可能属性的Enumeration值列表。此外,值列表将动态设置,并且可以包含1到10个枚举值。

select c.*
from comments c
join (
  values
    ("FOO",1),
    ("BAR",2),
    ("BAZ",3),
) as x (attribute, ordering) on c.attribute = x.attribute
order by x.ordering

如何在Spring Data存储库的Spring JOIN方法中表达此嵌套VALUE@Query对?还有哪些其他选项可以在Spring应用程序中表达此查询?

我对使用Hibernate,JPA或Spring Data(JPA)的解决方案持开放态度。

更新 我用Comment来证明这个问题,实际上我有一个更复杂的实体。出于这个问题的目的,我们假设Comment定义如下:

@Entity
class Comment {

   @Id @GeneratedValue Long id;
   String text;
   @Enumerated (value = EnumType.STRING)
   AttributeEnum attribute; //enum values: FOO, BAR, BAZ
}

现在,我想选择属性为'BAR''BAZ'的所有注释,并且我想在运行时指定在'BAZ'条注释之前订购'BAR'条评论

我希望实现一个与以下内容类似的函数:

Page<Comment> findCommentsByAttributeIn(List<AttributeEnum> attributes,
                                        Pageable pageable);

添加了约束,排序与列表中属性的顺序相匹配。因此,如果BAZ位于列表中的BAR之前,则会在BAR之前对其进行排序。

1 个答案:

答案 0 :(得分:0)

我可以提供以下解决方案:

首先创建具有排序顺序集的预定义表(您只需要):

sorting_sets

attribute | ordering | set
------------------------------
FOO       |     1    |  1
BAR       |     2    |  1
BAZ       |     3    |  1
FOO       |     3    |  2
BAR       |     2    |  2
BAZ       |     1    |  2

然后您可以使用以下查询:

@Query(value = "select c.* from comments c join sorting_sets ss on ss.attribute = c.attribute and ss.set = ?1 order by ss.ordering", nativeQuery = true)
List<Comment> getCommentsBySortingSet(int sortingSet);

获取与给定集相关的排序顺序。