#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.
надеюсь, это поможет