java - Spring MVC 根据id从多个表映射对象

标签 java spring hibernate spring-mvc

我有 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/

相关文章:

java - 如何在 Java 中创建函数 "timeoutable"?

java - Spring - 使用 TransactionSynchronizationManager 的测试方法

java - JPA:具有复合主键和单键的实体映射

java - Apache FTPClient 在文件即将下载完毕时无法检索文件

java - EHCache 消耗的内存与 HashMap 相同

spring - 在 SecurityContext 中找不到 Authentication 对象 - Spring 3.2.2

java - Spring Boot MVC 多模块可执行jar

java - 是否可以在 tomcat 7 中的同一端口上运行多个 Web 应用程序

java - 如何通过 Hibernate 对数据库列的任何读/写访问调用 Java 方法

java - 使用 Selenium 单击 div 标签内具有属性角色的按钮