Запрос с помощью play framework возвращает связанные таблицы без моего запроса


У меня есть следующие модели в игровом фреймворке.

@Entity
public class Parent extends Model {

  @Id
  public Long id;
  public String name;
  public List<Child> children = new ArrayList<Child>();

}

@Entity
public class Child extends Model {

  // Entity 2
  @Id
  public Long id
  public String name;
  @ManyToOne
  public Parent parent;

}

Выполнение следующего запроса дает мне больше информации, чем мне нужно.

 toJson(Child.find.all());

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

Я пробовал установить fetch=FetchType.LAZY, но это не имеет значения.

Может ли кто-нибудь помочь?

3 2

3 ответа:

Ebean имеет встроенную поддержку JSON, и вы можете использовать ее, если хотите точно контролировать части графа объектов, включаемые в JSON:

JsonContext jsonContext = Ebean.json();
JsonWriteOptions options = JsonWriteOptions.parsePath("id,name");
String json = jsonContext.toJson(list2, options);

И в качестве альтернативы вы можете применить PathProperties как к запросу, так и к json, например:

PathProperties pathProperties = PathProperties.parse("id,name");
query.apply(pathProperties);
// fetch only id and name
List<App> list3 = query.findList();

// json output only id and name
JsonWriteOptions options2 = new JsonWriteOptions();
options2.setPathProperties(pathProperties);
String json2 = jsonContext.toJson(list3, options2);

. Отметим, что Ebean 4.3 была поддержка JSON это с учетом использования Джексон ядра для парсинга и генерации (так это, используя Джексон под капотом). Вы используете Play so в настоящее время застрял на старой версии Ebean so вместо использования запроса.применять() вы бы использовали свойства пути.применить (запрос) я думаю.

Относительно @JsonIgnore ... очевидно, что разные варианты использования требуют разных JSON, поэтому эта функция существует в Ebean (когда вы получаете вариант использования, который должен включать Родительский like)

PathProperties pathProperties = PathProperties.parse("id,name,parent(id,name)");
...

Метод Джексона toJson() всегда извлекает все данные при сериализации объектов Ebean, поэтому он может быть реальным performance killer, что обсуждалось мое предложение использовать некоторый выделенный объект (не хранящийся в БД) и заполнять его только требуемыми данными из "исходного" объекта.

Проверьте другой ответ, который описывает этот подход .

Я просто выбрал аннотацию @JsonIgnore.