私はこのアプリケーションを開発するために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>
を、あなたは「AddObjectメソッドからが不足している:。 データベーススキーマとエンティティorderService.listAllOrders()メソッドは、OrderRepositoryのfindAll()またはカスタムfindMyOrdersクエリを呼び出しますか?リポジトリにMYORDERQUERY文字列を指定しますが、MYSWAPSQUERYをパラメータとしてカスタムクエリに追加します。あなたの他のエンティティが顧客と呼ばれ、情報列を持っていると仮定すると、ord.customerInfo = cust.infoに顧客がアクセスするようなものです。いくつかのコードを追加して、既存のコードベースをクリアしてください。 –
正確な質問には、2つのエンティティにあるすべてのフィールドを持つDTOクラスを作成し、findMyOrders()クエリの戻り値の型にそのDTOオブジェクトのリストを作成します。を一覧表示します。次に、そのリストをコントローラのmodelAndViewに追加し、そのフィールドをobjectName.fieldNameとして参照できます。 –
ありがとう、私はそれを試してみましょう。私は、この問題を解決するために両方のdbテーブルの属性を表すために単一のクラスを持つ必要があることに驚いています。 CustomerテーブルとOrdersテーブルの関係をそれぞれのモデルクラスにマッピングしました。上記の私の質問に関しては、HQLを使うときに "join ON"の必要はありません。 – James