我有 2 个模型:
契约(Contract)标题
public class ContractHeader {
@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "contractHeader")
private List<ContractEntitlement> contractEntitlements;
契约(Contract)权利
public class ContractEntitlement {
@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", nullable = false, insertable = false, updatable = false)
private ContractHeader contractHeader;
@Column(name = "ch_id")
private int chId;
1 个契约(Contract) (id) 可以有多个权利 (ch_id),因此当我创建表单时,我的 Controller 是:
ContractHeader ch = new ContractHeader();
ch.setContractEntitlements(new AutoPopulatingList<ContractEntitlement>(ContractEntitlement.class));
model.addAttribute("ch", ch);
这工作得很好,并且能够保存两个表的数据,但现在我的问题是检索它们:
View Controller :
model.addAttribute("contractHeader", new ContractHeader());
model.addAttribute("ch", this.contractHeaderService.listContractHeaders());
model.addAttribute("contractEntitlement", new ContractEntitlement());
model.addAttribute("ce", this.contractEntitlementService.listContractEntitlements());
查看jsp
<c:forEach items="${ch}" var="contractHeader">
... Elements to show each data
<c:forEach items="${ce}" var="contractEntitlement">
<c:if test="${contractHeader.id == contractEntitlement.chId}" >
... Elements to show each data
我生成 2 个对象并比较 View jsp 中的 id。
DAO 合约 header
Session session = this.sessionFactory.getCurrentSession();
List<ContractHeader> contractHeaderList = session.createQuery("from ContractHeader").list();
DAO 合约权利
Session session = this.sessionFactory.getCurrentSession();
List<ContractEntitlement> contractEntitlementList = session.createQuery("from ContractEntitlement").list();
是否有更好的或者我应该说一种正确的方法来获取与我使用一个模型(ContractHeader)创建数据时相同的数据?
最佳答案
在您的情况下,由于您似乎试图在循环中分层呈现数据,因此我将进行查询,该查询使用获取的 ContractEntitlements
实体来检索 ContractHeader
实体:
Session session = this.sessionFactory.getCurrentSession();
List<ContractHeader> contractHeaderList = session.createQuery(
"select ch from ContractHeader ch inner join fetch ch.contractEntitlements")
.list();
然后将页面部分更改为:
<c:forEach items="${ch}" var="contractHeader">
... Elements to show each data
<c:forEach items="${ch.contractEntitlements}" var="contractEntitlement">
... Elements to show each data
现在,我认为您不需要在嵌套循环中使用额外的测试。
关于java - Spring MVC 根据id从多个表映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940160/