2010-09-02 45 views
6

tôi không thể sử dụng sắp xếp trên bàn nối. Hãy để tôi giải thích;tiêu chí ngủ đông api tham gia bảng vấn đề

tôi có ba bảng. người dùng, vai trò và user_roles. thực thể JPA của tôi là User, UserRole, UserRolePK, Role.

|User |  | UserRole |  | UserRolePK |  | Role | 
|--------|  |----------|  --------------  -------- 
|id  |  | pk  |  | user  |  | id | 
|name |      | role  |  | name | 

trong thực tế sản lượng mà tôi muốn là: "SELECT * FROM user_roles ur THAM GIA người dùng u ON u.ID = ur.UserID ORDER BY u.name;"

vì vậy tôi cố gắng sử dụng API tiêu chí ngủ đông.

CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.addOrder(Order.asc("pk.user.name")); 
List userRoles = criteria.list(); 

Lỗi này là không thể giải quyết bất động sản: pk.user.name của: models.UserRole

làm thế nào tôi có thể sử dụng tiêu chuẩn API trên tham gia bảng?

Trả lời

9

Nếu một lớp tham chiếu đến các lớp khác, bạn không thể truy cập tài sản của mình trong Hạn chế và Đơn đặt hàng. Bạn sẽ phải tạo một bí danh cho các đối tượng được tham chiếu và sau đó sử dụng bí danh để xác định các Hạn chế và Đơn đặt hàng trên các đối tượng khác.

Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.createAlias("pk", "a1"); 
criteria.createAlias("a1.user", "a2"); 
criteria.addOrder(Order.asc("a2.name")); 
List userRoles = criteria.list(); 

Định nghĩa bí danh sẽ tạo kết hợp với các bảng của các lớp khác. Chỉ các thuộc tính được ánh xạ trực tiếp vào bảng của lớp hoặc bí danh mới có thể được sử dụng trong Hạn chế hoặc Đơn đặt hàng. Nếu lớp của bạn chứa các thành phần, chúng có thể được truy cập trực tiếp mà không có bí danh.

+0

có vẻ tốt nhưng nó không hoạt động. Cột không xác định 'a2x2_.Đặt tên 'trong' mệnh đề đặt hàng ' và đây là truy vấn sql được tạo bởi API tiêu chí. __ "chọn this_.RoleID là RoleID614_0_, this_.UserID là UserID614_0_ từ user_roles this_ order by a2x2_.Name asc" __ –

+0

Có thể có sự cố với ánh xạ. Tạo một bí danh nên thường tham gia vào bảng, nếu thuộc tính là mối quan hệ nhiều-một. Đồ họa bảng của bạn không chứa bất kỳ mối quan hệ nào. Có lẽ bạn nên thêm chúng hoặc thêm ánh xạ vào câu hỏi. – Reboot

1

Vâng, trước hết tôi nghĩ chúng ta sẽ thấy thực thể ánh xạ của bạn (Java Classes)

Mặt khác, tôi sẽ giả định lớp UserRole của bạn có một tham chiếu đến một trường hợp người dùng.

@Entity 
    @Table (name="UserRole") 
    public class UserRole{ 

     User user; 

     @OneToMany //correct mapping here 
     public User getUser(){return this.user;} 


    } 

Bạn nên sử dụng createCriteria để điều hướng association.

public List<UserRole> getRolesWithUser(){ 
    Criteria userRoleCriteria = session.createCriteria(UserRole.class); 
    userRoleCriteria.createCriteria("user"); //joins the table. 
    userRoleCriteria.addOrder("user.name"); //adds order 

    return criteria.list(); 
} 

Vấn đề ở đây là nó sẽ mang lại trường hợp của UserRole, nhưng bạn có thể điều hướng đến User.

List<UserRole> userRoles = getRolesWithUser(); 

for (UserRole role:userRoles){ 

    User user = role.getUser(); 
    //do something with role , user 
} 

Hãy xem Criteria API. Nó luôn hữu ích!

+0

Trong bảng user_roles cột UserID và RoleID là khóa chính. Vì vậy, tôi đã sử dụng khóa nhúng và Lớp bổ sung (UserRolePK) cho nó.UserRolePK có ánh xạ chính xác. –

1

khá dễ dàng chỉ cần sử dụng createCriteria trên các hiệp hội:

Criteria c=session.createCriteria(User.class) 
        .createCriteria("roles") 
        .add(Restrictions.eq("name","test") 
        .list(); 

này sẽ tham gia hai bảng cho người dùng entites và Bộ sưu tập liên quan của họ "vai trò". và sẽ trả về tất cả người dùng có vai trò được liên kết với chính họ được gọi là "thử nghiệm".

hy vọng rằng đã giúp

+0

Không có nhiều thuộc tính quan hệ như vai trò trong thực thể Người dùng. Thay vào đó, tôi đã sử dụng thực thể UserRole. –

Các vấn đề liên quan