Как получить частичный объект от самоссылающейся сущности - PullRequest
0 голосов
/ 04 апреля 2019

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

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

Я также попробовал 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.
}

Вот искатель, которым я пользуюсь

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 Ответ

0 голосов
/ 11 июля 2019

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

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

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

, где find -

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

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

hopeэта помощь

...