Monday, November 12, 2012

Hibernate Framework và mô hình MVC - 4

1.8. Mối kết hợp (Association)

Có 2 mối kết hợp thường được sử dụng. Đó là many-to-one và one-to-many. (còn lại rất hiếm được sử dụng, đó là one-to-one và many-to-many).

1.8.1. <many-to-one>

Có những thuộc tính và thẻ con sau:

• Child “column”: chứa tên thuộc tính để chỉ ra cái trường trong CSDL mà chứa khóa ngoại.
• Attribute “name”: tên của bảng trong CSDL mà được tham chiếu đến.
• Attribute “class”: đối tượng tương ứng của bảng trong CSDL mà được tham chiếu đến.
• Attribute “lazy”: nếu được set là true, nạp những đối tượng có liên quan từ CSDL mỗi lần nạp đối tượng này.

1.8.2. <one-to-many>

Để chỉ ra quan hệ one-to-many, ta không chỉ đưa ra thẻ one-to-many. Mà còn có những thức khác để làm:

• Đầu tiên, ta phải sử dụng thẻ <set>. Lớp tương ứng trong Java là Set. Ta sử dụng đối tượng này để giữ những giá trị của bảng tham chiểu đến bảng này.
• Trong thẻ này, ta phải chỉ ra các thuộc tính và các thẻ con sau:

§ Attribute “name”: tên của bảng tham chiếu đến bảng này.
§ Attribute “lazy”: nếu được set là true, nạp đối tượng liên quan từ CSDL mỗi lần nạp đối tượng này.
§ Child “key”: có thẻ con là column mà thuộc tính name của nó chứa cái tên của trường chứa khóa ngoại của bảng mà giữ cái id của bảng này.
§ Child “one-to-many”: chứa thuộc tính class để chỉ ra lớp tương ứng của bảng ngoại.


1.9. Simple Queries

1.9.1. HQL (Hibernate Query Language)

1.9.1.1. Tạo thể hiện

Để tạo một thể hiện của HQL, sử dụng session.createQuery(String)

1.9.1.2. Simple query

Ví dụ 1:
//get all records in table User.
Query query = session.createQuery("from User")


Ví dụ 2:
Query query = session.createQuery("from User u where u.name = :name");
query.setString("name", "THUAN");


Chú ý rằng User không phải là tên của bảng trong cơ sở dữ liệu. “User” là tên của đối tượng tương ứng với bảng đó. Và tên của những đối tượng này có phân biệt chữ hoa và chữ thường.

1.9.1.3. Kết bảng trong HQL

Một User chứa 1 tập hợp billings (có thuộc tính billings với accessor của nó). Trong mỗi billing, ta có 1 amount (số lượng). Bây giờ, ta muốn lấy tất cả User mà có billing chứa amount lớn hơn 100. Ta sử dũng HQL sau đây:
Query query = session.createQuery("from User user left join fetch user.billings billing where billing.amount > 100");


Chú ý rằng “billings” là tên của một thuộc tính trong cách thuộc tính của “User”. Và nó cũng có một getter và một setter cho billings.

1.9.1.4. Sub-query trong HQL

Ta muốn liệt ke toàn bộ user mà có billing (một vài user có thể không có billings). Ta sử dụng HQL sau đây:
Query query = session.createQuery("from User user where user in (select b.user from Billing b)");


Hoặc:
Query query = session.createQuery("from User user where exists (select 1 from user.billings)");


Chú ý rằng, sub-query trả về nhiều dòng. HQL cũng định nghĩa một số từ khóa để thu hẹp kết quả như: “in”, “all”, “any”, “some”.

1.9.1.5. Gom nhóm

Ví dụ:
Query query = session.createQuery("select count from User");
Query query = session.createQuery("select b.user, sum(b.amount) from Billing b group by b.user");


1.9.2. Điều kiện (Criteria)

1.9.2.1. Tạo thể hiện

Để tạo một thể hiện của Criteria, sử dụng: session.createCriteria(User.class)

1.9.2.2. Add(Criterion)

Tìm trong trong các điều kiện, sử dụng phương thức: add(Criterion)

Ví dụ 1:
Criteria crit = session.createCriteria(User.class);
crit.add(Restrictions.eq("name", "Thuan"); //tìm user có name = 'Thuan'


Những phương thức dưới đây dùng để giới hạn tìm kiếm:
eq(String colName,String value): equal
gt(String colName, String value): greater than
ge(String colName, String value): greater than or equal


và …

Ví dụ: 2: lấy tất cả billing mà có amount nhỏ hơn 100 hoặc lớn hơn 1000
Criteria crit = session.createCriteria(Billing.class);
Crit.add(Restrictions.or(
Restrictions.lt("amount", 100),
Restrictions.gt("amount", 1000));


Sử dụng điều kiện “and” bằng cách tương tự như trên.

1.9.2.3. Kết

Ví dụ dưới đây sẽ lấy tất cả Users (và Billings của họ) mà có amount (của billing) lớn hơn 100.
Criteria crit = session.createCriteria(User.class);
crit.createCriteria("billings", "bill");
crit.add(Restrictions.gt("bill.amount", new Integer(100));


1.9.3. SQL

1.9.3.1. Tạo thể hiện

Đề tạo một thể hiện của SQL Query, sử dụng:
session.createSQLQuery(String).addEntity(String)

Ví dụ:
Query query = session.createSQLQuery("select * from User").addEntity(User.class);


1.9.3.2. SQLGrammaException

Nếu ta chỉ chọn từ User nhưng ta addEntity khác (ví dụ như Billing), Ngoại lệ SQLGrammaException sẽ được ném ra.

Ví dụ:
//SQLGrammaExeption will be thrown in the following code
Query query = session.createSQLQuery("select * from User").addEntity(User.class).addEntity(Billing.cla ss);


1.9.3.3. Chọn nhiều bảng, chỉ addEntity một bảng

Nếu ta chọn từ nhiều bảng nhưng ta chỉ addEntity một bảng. Kiểu dữ liệu trả về chỉ là Entity đó.

Ví dụ:
Query query = session.createSQLQuery("select * from Billing b left join User u on u.ID = b.userID").addEntity(User.class);
//this query will return a List of User class.


1.9.3.4. Chọn nhiều bản, addEntity nhiều hơn 1 bảng

Nếu ta chọn từ nhiều bảng và ta addEntity nhiều hơn 1 bảng. Kiểu dữ liệu trả về là một mảng đối tượng chứa class theo thứ tự được add.

Ví dụ:
Query query = session.createSQLQuery("select * from Billing b left join User u on u.ID = b.userID")
.addEntity(User.class)
.addEntity(Billing.class);
Iterator iterator = query.list().iterator();
Object[] array;
User user;
Billing billing;
While (iterator.hasNext()) {
array = (Object[]) iterator.next();
User user = (User) array[0];
Billing billing = (Billing) array[1];
System.out.println("UserID = " + user.getId() + "; BillingID = " + billing.getId());
}


1.9.3.5. Gom nhóm

Ví dụ:
Query query = session.createSQLQuery("select count(1) userCount from User")
.addScalar("userCount", Hibernate.Integer);

Query query = session.createSQLQuery("select u.*, sum(b.amount) sumAmount from Billing b left join User u on u.ID = b.userID group by u.id")
.addEntity(User.class)
.addScalar("sumAmount", Hibernate.Integer);


Kiểu dữ liệu trả về là danh sách Object[2]. Object[0] là giá trị của phương thức addScalar method, kế tiếp là giá trị của phương thức addEntity.

1.9.4. Giới hạn kết quả trả về

Để giới hạn kết quả trả về, ta sử dụng 2 phương thức: setMaxResults(int) và setFirstResult(int).
2 phương thức này đều được thi hành bởi Criteria và Query

No comments:

Post a Comment