spring-data-rest,你能提供实体的全部细节而不是(或)链接

wen*_*nic 8 java spring spring-data-jpa spring-data-rest

有没有办法返回已加入实体的完整详细信息而不是链接?在下面的示例中,我还要返回产品的详细信息,如果我有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
    } ]
  }
}
Run Code Online (Sandbox Code Playgroud)

实体和存储库;

@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> {}
Run Code Online (Sandbox Code Playgroud)

lor*_*npa 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);
Run Code Online (Sandbox Code Playgroud)

更新

看起来您已经有相关实体了。假设您正在使用“预加载”,您所需要做的就是在存储库实现中执行一个简单的查询。预加载意味着 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();
}
Run Code Online (Sandbox Code Playgroud)

输入id只是 Book 键(像 105 这样的数字)。

希望有帮助:)