以下查询来自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
之前对其进行排序。
答案 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);
获取与给定集相关的排序顺序。