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 之类的东西。

因此,您将创建一个普通的旧 Java 对象 (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 项目的示例。方案很简单。我有一个“书”实体。每本“书”都有一个相关的“作者”。每个“作者”都有名字和姓氏。如果选择“Book”,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 回答
0

您可以编写 projecton 以获取详细信息。例如 PurchaseProjection 可以写成。

    @Projection(name="purchaseProduction",types={Purchase.class})
    interface PurchaseProjection{
       public User getUser();
        public Product getProduct();
        public Long getAmount();
      }

您可以使用 http://localhost:8080/webapp/purchase?projection=purchaseProduction访问结果

于 2017-10-21T10:05:27.660 回答