2017-07-17 7 views
0

私はこのアプリケーションを開発するためにSpring Boot、Thymeleaf、HibernateおよびJPAを使用しています。データを取得するために必要な2つのエンティティ間の関係をマップし、顧客が注文を閲覧したページの2つのテーブルのデータを表示する方法を知りました。Thymeleaf:同じページにある2つのJPAエンティティテーブルのデータを表示

私のコントローラクラスでは、ModelReviewオブジェクトに"viewmyorders"というオブジェクトを追加します。このオブジェクトには、2つのテーブル/エンティティからの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をパラメータとしてカスタムクエリに追加します。あなたの他のエンティティが顧客と呼ばれ、情報列を持っていると仮定すると、ord.customerInfo = cust.infoに顧客がアクセスするようなものです。いくつかのコードを追加して、既存のコードベースをクリアしてください。 –

+0

正確な質問には、2つのエンティティにあるすべてのフィールドを持つDTOクラスを作成し、findMyOrders()クエリの戻り値の型にそのDTOオブジェクトのリストを作成します。 を一覧表示します。次に、そのリストをコントローラのmodelAndViewに追加し、そのフィールドをobjectName.fieldNameとして参照できます。 –

+0

ありがとう、私はそれを試してみましょう。私は、この問題を解決するために両方のdbテーブルの属性を表すために単一のクラスを持つ必要があることに驚いています。 CustomerテーブルとOrdersテーブルの関係をそれぞれのモデルクラスにマッピングしました。上記の私の質問に関しては、HQLを使うときに "join ON"の必要はありません。 – James

答えて

0

あなたはあなたのサービスクラスは、受注の一覧を返しますので、このリストをループするとき、あなたのviewmyorderは、同じ属性を持つことになり、あなたのOrderオブジェクトが持つ属性に到達することができるようになりますあなたの秩序と同じように。 http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html#spring-model-attributes

+0

ありがとうございました、私はすでに、アプリケーションの他のページにある単一のモデルオブジェクトからのデータを表示しています。しかし、注文データの横の顧客データを同じページにどのように表示できますか? – James

+0

もちろん、多くの属性を追加することができます。たとえば、modelAndView.addObject( "viewmycustomers、customerService.listAllCustomers());と同じテクニックでこのリストをループすることができます。 – Leah

+1

と申し訳ありません注文の一部として顧客データが必要な場合は、クラスにも接続する必要があります。注文に顧客属性が含まれている必要があります。注文を選択すると、顧客も入力されます。 – 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()方法は、同様にCustomerデータが含まれていますOrdersエンティティのリストを与えます。コントローラーで行ったように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

あなたのCustomerエンティティは、このようなものであると仮定すると: '@Entity クラスのお客様{ ... @OneToOne(mappedBy = "顧客") 民間受注の受注; ... } '、正しく動作するはずですので、関連するデータを返します。 –

関連する問題