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)
是的。
因此,您将创建一个普通旧 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 这样的数字)。
希望有帮助:)
归档时间: |
|
查看次数: |
4774 次 |
最近记录: |