使用play框架查询会在没有我询问的情况下返回相关表

时间:2013-03-26 16:04:13

标签: java playframework ebean

我在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 个答案:

答案 0 :(得分:2)

杰克逊的toJson()方法总是在序列化Ebean的对象时获取所有数据,因此它可以是真实的performance killer,我讨论过我的命题是使用一些专用对象(不存储在数据库中)并仅在需要时填充它来自“原始”对象的数据。

检查其他答案,which describes this approach

答案 1 :(得分:1)

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支持重构,以便使用Jackon核心进行解析和生成(因此它在引擎盖下使用了Jackson)。您正在使用Play,因此目前卡在旧版本的Ebean上,所以我不想使用query.apply(),而是使用pathProperties.apply(查询)。

关于@JsonIgnore ......显然不同的用例需要不同的JSON,这就是Ebean中存在此功能的原因(当你得到一个需要包含父类的用例时)

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

答案 2 :(得分:0)

我只是选择@JsonIgnore注释。