9

リンクの代わりに、結合されたエンティティの完全な詳細を返す方法はありますか? 以下の例では、製品の詳細も返したいと考えています。100 件の購入リストがある場合、製品の詳細を取得するために 100 回の呼び出しを行う必要がなくなります。

Product、User、および Purchase エンティティのリポジトリはすべて spring-data-jpa を使用して作成されます

{
  "_embedded" : {
    "purchase" : [ {
      "_links" : {
        "product" : {
          "href" : "http://localhost:8080/webapp/purchase/1/product"
        },
        "user" : {
          "href" : "http://localhost:8080/webapp/purchase/1/user"
        }
      },
      "purchasedOn" : "2014-02-23",
      "amount" : 1
    } ]
  }
}

エンティティとリポジトリ。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Purchase.class, orphanRemoval = true)
    @JoinColumn(name = "user_id", updatable = false)
    private List<Purchase> purchases = new ArrayList<>();

}

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

}

@Entity
public class Purchase implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

    @ManyToOne(fetch = FetchType.EAGER, targetEntity = Product.class)
    @JoinColumn(name = "product_id", referencedColumnName = "id")
    private Product product;

    @Column(name = "purchase_date")
    private Date purchaseDate;

    private Integer amount;

}

@Repository
public interface PurchaseRepository extends JpaRepository<Purchase, Long> {}
4

3 に答える 3

2

この機能に対する新機能のリクエストが既にあるようです。

https://jira.springsource.org/browse/DATAREST-221

https://jira.springsource.org/browse/DATAREST-243

機能が実装されるまで、質問を開いたままにします。

于 2014-02-27T10:44:06.463 に答える
0

はい。

TypedQueryのようなものを使用できます。

したがって、必要なすべての列 (フィールド) を保持する Plain Old Java Object (POJO) を作成します。次に、TypeQuery を使用してデータベースからすべてのフィールドを取得し、カスタム結果セット (つまり、POJO または POJO のコレクション) を返します。

次に例を示します。

TypedQuery<BookExport> q = (TypedQuery<SOME_POJO>) entityManager.createQuery(
    "select new SOME_PJOP(a.field1, a.field2, a.field2) " +
    "from SOME_ENTITY AS a",
    SOME_POJO.class);

アップデート

関連するエンティティが既にあるようです。"Eager Loading"を使用していると仮定すると、リポジトリ実装で簡単なクエリを実行するだけで済みます。Eager Loading は、JPA が関連する属性を自動的に選択することを意味します。Jersey を使用して JSON で結果をシリアル化する場合、デフォルトでは、結果セットのフィールドがシリアル化されます。

これは、私が最近完了した JPA プロジェクトの例です。スキームは簡単です。「本」エンティティがあります。各「書籍」には、関連する「著者」があります。各「著者」には姓と名があります。「本」を選択すると、JPA クエリは著者の姓名も選択します。それはあなたが達成しようとしていることと似ていると思います:

@Override
@Transactional
public Object findOne(Serializable id) {
    Query q = entityManager.createQuery("select a from Book a where a.id = ?1");
    q.setParameter(1, id);
    return q.getSingleResult();
}

入力idは単に Book キー (105 のような数字) です。

それが役立つことを願っています:)

于 2014-02-23T23:17:23.147 に答える