2011-08-01 37 views
6

Tôi có một phương pháp dịch vụ Hibernate như vậy: "SELECT sc FROM SecurityContact sc WHERE sc.securityId=:securityId2". securityId2 được thông qua bởi người dùng. Mỗi SecurityContact có nhiều mối quan hệ với một Contact, do đó Hibernate tự động gọi một phép nối khi truy vấn này chạy. Tuy nhiên, sự tham gia mà Hibernate luôn chạy là một phép nối bên trong, nó sẽ không hoạt động đúng cho mục đích của tôi. Có cách nào để buộc Hibernate để nội bộ tạo ra một tham gia bên ngoài bên trái để thay thế? Đây là mã cho lớp SecurityContact:Hibernate Left Outer Tham gia

/** 
* The persistent class for the SecurityContact database table. 
* 
*/ 
@Entity 
@FXClass(kind=FXClassKind.REMOTE) 
public class SecurityContact implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Transient private String uid; 
    @FXIgnore 
    public String getUid() { 
     if (uid == null) { 
      uid = "" + securityContactId; 
     } 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="securityContact_id") 
    private Long securityContactId; 

    @Column(name="security_id") 
    private String securityId; 

    @Column(name="create_date") 
    private String createDate; 

    @Column(name="create_user") 
    private String createUser; 

    @Column(name="modify_date") 
    private String modifyDate; 

    @Column(name="modify_user") 
    private String modifyUser; 

    //bi-directional many-to-one association to AgentContact 

    @ManyToOne 
    @JoinColumn(name="agent_id", referencedColumnName="contact_id") 
    private AgentContact agentContact; 

    //bi-directional many-to-one association to AuditContact 
    @ManyToOne 
    @JoinColumn(name="audit_id", referencedColumnName="contact_id") 
    private AgentContact auditContact; 

    public SecurityContact() { 
    } 
    @FXKeyColumn 
    public Long getSecurityContactId() { 
     return this.securityContactId; 
    } 

    public void setSecurityContactId(Long securityContactId) { 
     this.securityContactId = securityContactId; 
    } 

    public String getSecurityId() { 
     return this.securityId; 
    } 

    public void setSecurityId(String securityId) { 
     this.securityId = securityId; 
    } 

    public String getCreateDate() { 
     return this.createDate; 
    } 

    public void setCreateDate(String createDate) { 
     this.createDate = createDate; 
    } 

    public String getCreateUser() { 
     return this.createUser; 
    } 

    public void setCreateUser(String createUser) { 
     this.createUser = createUser; 
    } 

    public String getModifyDate() { 
     return this.modifyDate; 
    } 

    public void setModifyDate(String modifyDate) { 
     this.modifyDate = modifyDate; 
    } 

    public String getModifyUser() { 
     return this.modifyUser; 
    } 

    public void setModifyUser(String modifyUser) { 
     this.modifyUser = modifyUser; 
    } 
    @FXManyToOne(parent="parent", property="contactId") 
    public AgentContact getAgentContact() { 
     return this.agentContact; 
    } 

    public void setAgentContact(AgentContact agentContact) { 
     this.agentContact = agentContact; 
    } 
    @FXManyToOne(parent="parent", property="contactId") 
    public AgentContact getAuditContact() { 
     return this.auditContact; 
    } 

    public void setAuditContact(AgentContact auditContact) { 
     this.auditContact = auditContact; 
    } 

} 
+0

Bạn có thể đăng tệp hoặc chú thích ánh xạ của mình không? – dfb

Trả lời

2
+0

Bạn có nghĩa là bao gồm chú thích @Fetch (FetchMode.SELECT) không? –

+0

Có - đó là chú thích tương đương với XML trong tài liệu mà tôi đặt ở đó. – dfb

+0

Xin lỗi vì câu hỏi ngớ ngẩn, nhưng chỉ để chắc chắn, nơi chính xác trong phân đoạn mã được cung cấp, tôi có đang đặt chú thích cho biết không? –

0

Trong configs ngủ đông của bạn thiết lập thuộc tính use_outer_join là true.

+0

Điều này dường như không có bất kỳ ảnh hưởng nào. –

1

Theo tài liệu Hibernate, ngôn ngữ truy vấn ngủ đông nên hỗ trợ điều này. (Ít nhất trong phiên bản 3,3)

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins

Cố gắng tạo truy vấn của bạn như thế này:

Query query = entityManager.createQuery("Select sc from SecurityContact as sc " + 
             "left outer join sc.agentContact as c " + 
             "where sc.securityId=:securityId2"; 

EDIT: Thay đổi sở hữu liên lạc của sc đến tài sản agentContact bạn cung cấp chi tiết câu hỏi của bạn.

+0

Với truy vấn của tôi thiết lập là: "SELECT sc FROM SecurityLiên hệ sc LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =: securityId2", điều này dường như không hoạt động. –

+0

Bạn có thể thử thêm ac vào lựa chọn: "SELECT sc, ac FROM SecurityContact sc LEFT OUTER JOIN sc.agentContact ac WHERE sc.securityId =: securityId2" không. Kết quả sẽ là một Object Array với kết quả. – david

+0

Hibernate không thích truy vấn đó vì một số lý do. Nó ném lỗi khi biên dịch lại. –

1

Mối quan hệ: Tài khoản nhiều - nhân viên một

cấu hình trong xml: Mã

 <many-to-one name="employee" class="active.security.domain.Employee" lazy="false"> 
     <column name="EmpId" /> 
    </many-to-one> 

java:

 Session session = HibernateUtil.getCurrentSession(); 

    Criteria criteria = session.createCriteria(Account.class); 
    criteria.add(Restrictions.eq("application.id", applicationID)); 
    List<Account> list = criteria.list(); 

chìa khóa là sử dụng criteria.list();

0

tôi đã có cấu hình sau:

<many-to-one column="user_id" lazy="proxy" fetch="join" insert="false" name="user" not-null="true" update="false" not-found="ignore" /> 

Cột user_id là không rỗng, nhưng tôi muốn có một LEFT OUTER JOIN (thay vì INNER JOIN tôi đã nhận được), bởi vì nó chỉ là một DB hack - đôi khi user_id = 0 không được ánh xạ tới bất kỳ hàng nào trong bảng người dùng (0 như là một thay thế cho NULL). Tôi không muốn chế độ fetch=select

Sau nhiều lần gỡ lỗi trong khoảng thời gian Hibernate tôi đặt not-null="false" giải quyết vấn đề cho tôi :) (Tôi đã nhận được LEFT OUTER JOIN). Hy vọng rằng ai đó sẽ tìm thấy nó hữu ích (btw .: Tôi đang sử dụng Hibernate 3.6.0.Final).

0

Tôi gặp sự cố tương tự. Tôi đã có DAO SiebelUser. Mỗi SiebelUser liên quan đến một nhóm với nhiều mối quan hệ. Một số SiebelUser đã có userid = 0 là khóa ngoài mà không có khóa chính nào hiện diện trong bảng Users. Vì vậy, tự nhiên lấy từ bảng SeibelUsers đã bỏ qua người dùng với userd id = 0. Đây là cấu hình trước đó

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams"> <column name="TEAMID" length="4" not-null="true" /> </many-to-one>

Vì vậy, Để giải quyết vấn đề của tôi, tôi đã thay đổi cấu hình để. Nhưng nó không hiệu quả với tôi.

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams" **fetch="join" not-null="false" lazy="proxy" not-found="ignore"**> <column name="TEAMID" length="4" not-null="**false**" /> </many-to-one>

Cuối cùng tôi đã thay đổi truy vấn của tôi để làm rõ ràng một trái bên ngoài tham gia như thế này cho con đường specifc từ SiebelUsers bảng Users.

select property1, property2, ... 
from from **SiebelUser s left outer join s.team t** 
where property1='x' 

Điều này phù hợp với tôi.

Lưu ý rằng lớp SiebelUser của tôi đã có đối tượng Nhóm làm thuộc tính của nó (như được định nghĩa trong đường dẫn ở trên). Hy vọng nó sẽ giúp ai đó.

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