Как получить частичный объект из объекта, ссылающегося на себя

#playframework #entity #one-to-many #ebean

#playframework #объект #один ко многим #ebean

Вопрос:

Как я могу получить частичный результат из объекта, ссылающегося на себя, который имеет отношения пары родитель-потомок?

Я пытался получить целые объекты entity, а затем преобразовать их в частичный объект.

Я также попробовал FetchGroup, выбрать частичные столбцы и другие.

Но ни один из них не сработал. Когда он извлекает дочерние элементы, весь объект изменяется, чтобы привести к целому объекту.

 @Entity
public class someClass extents Model {

    public String name;
    public String code;

    @ManyToOne
    @JsonBackReference
    public Menu parent;

    @OneToMany(mappedBy = "parent")
    @JsonManagedReference
    public Set<someClass> children;

    other columns and getters/setters.
}
  

Вот finder, который я использую

 public static List<someClass> findInTree() {
    find
            .query()
            .where()
            .isNull("parent")
            .findList();
}
  

и я вижу запущенные запросы

 [info] o.j.StatementLogger - select t0.id, t0.code, t0.name from some_entity t0 where t0.parent_id is null  and t0.is_active = Y  and  to_timestamp('2019-04-04 19:05:54.333', 'yyyy-MM-dd hh24:mi:ss.ff3') between t0.start_date and t0.end_date ;
[info] o.j.StatementLogger - select t0.parent_id, t0.id from some_entity t0 where (t0.parent_id) in (1, 2, 3, 4, 1 ) ;
[info] o.j.StatementLogger - select t0.id, t0.code, t0.name from some_entity t0 where t0.id in (5, 6, 5, 5, 5 ) ;
[info] o.j.StatementLogger - select t0.parent_id, t0.id from some_entity t0 where (t0.parent_id) in (5, 6, 5, 5, 5 ) ;
[info] o.j.StatementLogger - select t0.id, t0.code, t0.name from some_entity t0 where t0.id in (7, 8, 7, 7, 7 ) ;
[info] o.j.StatementLogger - select t0.parent_id, t0.id from some_entity t0 where (t0.parent_id) in (7, 8, 7, 7, 7 ) ;
  

и результат был

 "someClass":[  
         {  
            "id":1,
            "code":"test1",
            "name":"test1",
            "children":[  

            ],
            ... rest of columns
         },
            ... 
         {  
            "id":4,
            "code":"test1",
            "name":"test1",
            "children":[  
               {  
                  "id":5,
                  "code":"test1",
                  "name":"test1",
                  "children":[  
                     {  
                        "id":7,
                        "code":"test1",
                        "name":"test1",
                        "children":[  

                        ],
                     },
              ... rest of columns

                  ],
            ... rest of columns

               },
...
]
  

Я беспокоюсь о том, что рекурсивные запросы потребляют слишком много ресурсов, когда они становятся больше.

А также, я хочу использовать эту практику для других объектов, которые имеют разные отношения.

Ожидаемый результат выглядит следующим образом.

 "someClass":[  
         {  
            "id":1,
            "code":"test1",
            "name":"test1",
            "children":null,
         },
            ... 
         {  
            "id":4,
            "code":"test1",
            "name":"test1",
            "children":[  
               {  
                  "id":5,
                  "code":"test1",
                  "name":"test1",
                  "children":[  
                     {  
                        "id":7,
                        "code":"test1",
                        "name":"test1",
                        "children":null,
                     },
                  ],
               },
...
]
  

Я хочу удалить все ненужные данные из результата и, надеюсь, сократить количество запросов на получение отображений для оптимизации.

Есть ли лучшая практика или примеры, которые я могу посмотреть?

С наилучшими пожеланиями.

Ответ №1:

Я делаю это следующим образом

 [ModelClassName].find.select("field1, field2, ...")

.where
...
....
.findList();
  

где find находится

 public static final Finder<primaryKeyType, ClassName> find = new Finder<>(ProClassNameducts.class);
  

обратите внимание, что имя поля похоже на ваш класс модели, а не на DB.

надеюсь, это поможет