Рекурсивный запрос в спящем режиме - PullRequest
0 голосов
/ 05 марта 2020

У меня есть модель с родителем / дочерним отношением, 1 категория может иметь 1 / более подкатегорию

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "category_id")
    private int id;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="parent_id")
    private Category parent;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "parent_id")
    private Set<Category> children;

Когда я использую findAll () (spring-data-jpa), у меня результат как

[
{
   id:1
   children: [ 
        {
            id:2
            children: [] 
        },
        {
            id:3
            children: [ 
                 {
                     id:4
                     children: [] 
                 }
            ]
        }
    ]
},
{
  id:2
  children: []
},
{
  id:3
  children: [
       {
          id:4
          children: [] 
       }
  ]
},
{
  id:4
  children: [] 
},
{
  id:5
  children: [] 
}
]

Я хочу собственный запрос или что-то вроде (выберите ... отлично), который возвращает только категории root, а не категории, которые являются только потомками других категорий. Таким образом, 2, 3 и 4 не должны быть частью ожидаемого результата (см. Ниже).

[
{
   id:1
   children: [ 
        {
            id:2
            children: [] 
        },
        {
            id:3
            children: [ 
                 {
                     id:4
                     children: [] 
                 }
            ]
        }
    ]
},
{
  id:5
  children: [] 
}
]

Спасибо за помощь.

1 Ответ

0 голосов
/ 05 марта 2020

Вам следует попробовать HQL-запрос, подобный этому (только в качестве примера и не проверенный, но, надеюсь, он направит вас в правильном направлении на go впереди):

String hql = 
    "select c from Category c where c.id not in (" +
        "select distinct child.id from Category p join p.children child" +
    ")";
List<Category> rootCategories = 
    sessionFactory.getCurrentSession().createQuery(hql).list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...