Spring Data JPA,基于嵌套集合

时间:2017-07-07 19:22:45

标签: spring sorting spring-data-jpa

由于代码库已经在使用Spring Data JPA,我想创建一个Sort 对象,它将基于特定元素的存在(或缺少) 存在于集合中,集合本身是集合中的元素之一 主表。 Sort对象的属性需要是动态的,因为用户可能想要排序 记录一次,另一次记录。

明确地说,如果多个PrimaryEntity对象的SecondaryEntity为' type'设置为特定的 价值,然后我想根据相应的'注释来对它们进行排序。在相应的字段中 SecondaryEntity。此外,虽然我想要检索所有SecondaryEntity对象,我想要的 排序仅基于SecondaryEntity记录,其中' type'等于,比如,重要'。

这些课程如下所示(我还重新定义了'等于'&' hashCode'对于SecondaryEntity):

public class PrimaryEntity 
{

@OneToMany(mappedBy = "primary", cascade = CascadeType.ALL)
@MapKey(name = "type")
private Map<String, SecondaryEntity> myMap = new HashMap<>();

@Column(name = "name")
private String name;

}

public class SecondaryEntity 
{

@Column(name = "type", length = 200)
private String type;

@Column(name = "notes", length = 2000)
private String notes;

@ManyToOne
@JoinColumn(name = "primary_id", referencedColumnName = "id")
private PrimaryEntity primary;

 }

然后我想创建一个类似于以下语法的Sort:

Sort sort = new Sort(&#34; myMap [important] .notes&#34;)

最后,当我努力按照上面的方式对PrimaryEntity记录进行排序时,它并不重要 对于给定的PrimaryEntity,我如何显示其SecondaryEntity记录。

例如,

<html>
<head>
<style>
table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
}
</style>
</head>
<body>
<table>
  <tr>
    <th>Name</th>
    <th>Type</th>
    <th>Notes</th>
  </tr>
  <tr>
    <td>Second primary</td>
    <td>Important</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Second primary</td>
    <td>Other</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Second primary</td>
    <td>Miscellaneous</td>
    <td></td>
  </tr>
  <tr>
    <td>Third primary</td>
    <td>Important</td>
    <td>2</td>
  </tr>
  <tr>
    <td>First primary</td>
    <td>Important</td>
    <td>3</td>
  </tr>
</table>
</body>
</html>

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以选择使用findAll(Sort sort)注释覆盖SecondaryRepo中的@EntityGraph方法:

public interface SecondaryRepo extends JpaRepository<Secondary, Long> {

    @EntityGraph(attributePaths = {"primary"})
    @Override
    List<Secondary> findAll(Sort sort);
}

急切地获取相关的Primaries。

然后只需使用Sorttype定义note并获取辅助代码(也将包含其初级代码),如下所示:

Sort sort = new Sort(new Sort.Order("type"), new Sort.Order("note"));
List<Secondary> list = secondaryRepo.findAll(sort);

请参阅exampletest