2017-07-17 80 views
0

我正在使用Spring Boot,Thymeleaf,Hibernate和JPA來開發此應用程序。我已經映射了我需要從中檢索數據的兩個實體之間的關係,並且想知道如何顯示客戶查看其訂單的頁面上的兩個表中的數據。Thymeleaf:在同一頁上顯示來自兩個JPA實體表的數據

在我的控制器類中,我將對象"viewmyorders"添加到ModelAndView,它將包含來自兩個表/實體的HQL查詢的結果。我應該在Thymeleaf模板上使用什麼語法來在頁面上顯示數據?這兩個表格的結果是否會以 "${viewmyorder.}"?在"."之後 - 數據庫中相關列的名稱?

幫助感謝!

訂單類別:

@Entity 
@Table(name = "orders") 
public class Orders { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "orderno") 
private int id; 

@Column(name = "item_name") 
private String itemName; 

@Column(name = "description") 
private String itemDescription; 

@Column(name = "cost") 
private String cost; 

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "orderId") 
private Customer customerInfo; 

//getters and setters 
} 

Customer類:

@Entity 
@Table(name = "customer") 
public class Customer { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "cust_id") 
private int cust_id; 

@Column(name = "fName") 
private String firstName; 

@Column(name = "surName") 
private String surName; 

@Column(name = "address") 
private String address; 

@Column(name = "phone") 
private String phone; 

@Column(name = "orderId") 
private int orderId; 

@Column(name = "active") 
private int isactive; 

@OneToOne(mappedBy="customerInfo") 
private Orders orderInfo; 

//getters and setters 
} 

庫類:

public interface OrderRepository extends JpaRepository<Orders, Integer> { 

//customerInfo is the object (of type orders) which maps the relationship between the two entities 
String MYORDERQUERY = "SELECT ord, cust from Orders ord inner join ord.customerInfo cust"; 

@Query(MYSWAPSQUERY) 
List<Orders> findMyOrders();  
} 

控制器方法:

@RequestMapping(value={"/viewmyorders"}, method = RequestMethod.GET) 
public ModelAndView viewOrders(){ 
    ModelAndView modelAndView = new ModelAndView(); 
    //orderService calls method above from Repository class to return order info 
    modelAndView.addObject("viewmyorders", orderService.listAllOrders()); 
    return modelAndView; 
} 

表Thymeleaf模板頁:

    <table class="table table-striped"> 
         <tr> 
          <th>Order Number</th> 
          <th>Product Description</th> 
          <th>Delivery Address</th> 
          <th>Contact Number</th> 
         </tr> 
         <tr th:each="viewmyorder : ${viewmyorders}"> 
          <td th:text="${viewmyorder.orderno}"></td> 
          <td th:text="${viewmyorder.description}"></td> 
          <td th:text="${viewmyorder.address}"></td> 
          <td th:text="${viewmyorder.phone}"></td> 
         </tr>      
        </table> 
+0

在你的控制器,你缺一「,從ADDOBJECT方法是什麼。您的orderService.listAllOrders()方法是否會調用OrderRepository的findAll()或您的自定義findMyOrders查詢?您在存儲庫中指定MYORDERQUERY字符串,但將MYSWAPSQUERY添加爲您的自定義查詢的參數。即使這個查詢看起來無效,我認爲它應該是這樣的...如果我假設你的另一個實體被稱爲Customer並且它有一個info列,那麼inner join Customer cust on ord.customerInfo = cust.info。請提供更多代碼並清除現有的代碼庫。 –

+0

爲了確切的問題,我將創建一個DTO類,它包含兩個實體所有的字段,並使findMyOrders()查詢的返回類型成爲該DTO對象的列表,例如,列表。然後,您可以將該列表添加到控制器中的modelAndView中,並可以將它的字段稱爲objectName.fieldName –

+0

謝謝我會試試。我很驚訝,有必要有一個類來表示來自兩個數據庫表的屬性來解決這個問題。我在他們各自的模型類中映射了Customer表和Orders表之間的關係。關於我上面的查詢,在使用HQL時不需要「加入」。 – James

回答

0

您將能夠達到您的訂單對象具有的屬性,因爲你的服務類返回的訂單列表,通過這個列表循環,當你viewmyorder將具有相同的屬性因爲你的訂單有。

有關語法,引用:http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html#spring-model-attributes

+0

謝謝,我已經在應用程序中的其他頁面上顯示來自單個模型對象的數據。但是,如何才能在同一頁面的訂單數據旁邊顯示客戶數據? – James

+0

當然,您可以根據需要添加任意數量的屬性,例如,您將擁有一個modelAndView.addObject(「viewmycustomers,customerService.listAllCustomers());並且使用相同的技術也可以循環訪問該列表。 – Leah

+1

and sorry ,如果您希望將客戶數據作爲訂單的一部分,那麼您也應該連接這些類,以便您的訂單具有客戶屬性,並且當您選擇訂單時,客戶也將被填充。 – Leah

2

如果您Orders實體具有Customer領域,例如

@Entity 
class Orders { 
    ... 
    @OneToOne 
    @JoinColumn(name = "customer_id") 
    private Customer customer; 
    ... 
} 


@Entity 
class Customer { 
    ... 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "customer_id") 
    @NotNull 
    private Long id; 
    ... 
    @OneToOne(mappedBy = "customer") 
    private Orders orders; 
    ... 
} 

那麼你OrderRepositoryfindAll()方法使Orders實體將包含Customer數據以及列表。您可以像在控制器中那樣將該列表傳遞給您的Thymeleaf模板,然後參考Customer數據。 ${viewmyorders.customer.address}

編輯: 課程不僅findAll()但返回Orders實體的所有列將包含Customer數據的查詢,自定義查詢的結果了。

編輯#2: 我想你想somethink這樣的: 數據庫模式和實體:

CREATE TABLE orders (
    order_id INT NOT NULL, 
    item_name VARCHAR(20), 
    description VARCHAR(50), 
    cost  VARCHAR(20) 
); 


CREATE TABLE customer (
    cust_id INT   NOT NULL, 
    fName  VARCHAR(20), 
    surName VARCHAR(20), 
    address  VARCHAR(50), 
    phone  VARCHAR(15), 
    active INT, 
    order_id INT, 
    FOREIGN KEY (order_id) REFERENCES orders (order_id) 
); 



@Entity 
@Table(name = "orders") 
public class Orders { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "order_id") 
private int id; 

@Column(name = "item_name") 
private String itemName; 

@Column(name = "description") 
private String itemDescription; 

@Column(name = "cost") 
private String cost; 

@OneToOne(mappedBy = "orderInfo", cascade = CascadeType.ALL) 
private Customer customerInfo; 

//getters and setters 
} 



@Entity 
@Table(name = "customer") 
public class Customer { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "cust_id") 
private int cust_id; 

@Column(name = "fName") 
private String firstName; 

@Column(name = "surName") 
private String surName; 

@Column(name = "address") 
private String address; 

@Column(name = "phone") 
private String phone; 

@Column(name = "active") 
private int isactive; 

@OneToOne 
@JoinColumn(name = "order_id") // This will map the primary key of orders table to the column named order_id in customer table (see SQL above), you do not need to create a field for it in java entity 
private Orders orderInfo; 
// Later you can reference order_id through a Customer like customer.getOrderInfo().getId(); 

//getters and setters 

}

+0

謝謝 - 只需要確認一下上面的例子:Orders表的id(PK)被映射到Customer表中的「customer_id」列,是這種情況嗎? – James

+0

由於我的存儲庫類中的findAll()方法現在使用上面建議的語法從兩個實體中返回數據,但是數據未鏈接 - 當在我的Thymeleaf頁面上顯示時,兩個表中的數據都按順序依次出現到每個表的主鍵。 – James

+0

假設你的客戶的實體是這樣的: '@Entity 一流的客戶{ ... @OneToOne(的mappedBy = 「客戶」) 私人訂單的訂單; ... }',它應該正常工作,因此返回相關的數據。 –

相關問題