Spring MVC Map 对象来自基于 id 的多个表



>我有 2 个模型:

合约头

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;

合同权利

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 个合约 (ID) 可以有多个权利 (ch_id),因此当我创建表单时,我的控制器是:

ContractHeader ch = new ContractHeader();
ch.setContractEntitlements(new AutoPopulatingList<ContractEntitlement>(ContractEntitlement.class));
model.addAttribute("ch", ch);

这工作得很好,并且能够保存两个表的数据,但现在我的问题是检索它们:

视图控制器:

model.addAttribute("contractHeader", new ContractHeader());
model.addAttribute("ch", this.contractHeaderService.listContractHeaders());
model.addAttribute("contractEntitlement", new ContractEntitlement());
model.addAttribute("ce", this.contractEntitlementService.listContractEntitlements());

查看日文

<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 个对象并比较视图 jsp 中的 id。

DAO 合约头

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

现在,我认为您不需要在嵌套循环中使用额外的测试。

最新更新