2

PlayFrameworkには次のモデルがあります。

@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が、違いはありません。

誰か助けてもらえますか?

4

3 に答える 3

2

JacksonのtoJson()メソッドは、Ebeanのオブジェクトをシリアル化するときに常にすべてのデータをフェッチするため、実際の可能性があります。performance killer私の提案では、専用オブジェクト(DBに格納されていない)を使用し、「元の」オブジェクトからの必要なデータのみを入力することを提案しました。

このアプローチを説明している他の回答を確認してください。

于 2013-03-26T16:28:46.317 に答える
1

EbeanにはJSONサポートが組み込まれており、オブジェクトグラフの一部を正確に制御してJSONに含める場合は、これを使用できます。

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

または、次のように、クエリとjsonの両方にPathPropertiesを適用することもできます。

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では、解析と生成にJackonコアを使用するようにjsonサポートがリファクタリングされていることに注意してください(したがって、内部でJacksonを使用しています)。Playを使用しているため、現在は古いバージョンのEbeanに固執しているため、query.apply()を使用する代わりに、pathProperties.apply(query)を使用すると思います。

@JsonIgnoreに関して...明らかに異なるユースケースには異なるJSONが必要です。そのため、この機能はEbeanに存在します(親のようなものを含める必要があるユースケースを取得する場合)

PathProperties pathProperties = PathProperties.parse("id,name,parent(id,name)");
...
于 2014-12-01T01:37:27.257 に答える
0

@JsonIgnore私は単に注釈を選びました。

于 2013-05-14T23:01:19.017 に答える