2015-04-17 163 views
3

我使用Hibernate 4.3.6
我有一個名爲StudyCase一個實體映射與數據庫中的表稱爲StudyCase ,我也有一個其他實體名稱與數據庫調用的測量表中映射的測量。每個StudyCase對象都可以與許多Measurement對象關聯,問題是這樣的。 我想將這兩個表映射到一個名爲mergedEntity的新實體中,並使用來自兩個表的列進行查詢,結果將成爲與具有相同約束的Measurement對象具有一對一關係的對象的列表,但也將具有爲他們所屬的StudyCase對象分配了信息。春天JPAHibernate映射一類兩個表(這兩個表具有多對一的關係)

我做了一些工作simmilar:

public List<MergeObject> searchMeasurement(String actualConditions) 
{ 
    jdbcTemplate = new JdbcTemplate(dataSource); 
    String sql = "select * from Measurement INNER JOIN StudyCase ON Measurement.study_case_number=StudyCase.study_case_number where "+actualConditions ; 
    List<MergeObject> result = this.jdbcTemplate.query(sql, new BeanPropertyRowMapper<MergeObject>(MergeObject.class)) ; 

    return result ; 
} 

有什麼辦法,我可以使用Hibernate實現同樣的事情。 謝謝!

+0

我有一個類似的要求我想將兩個表格(其中有一對多關係)映射到一個類別來處理結果。這些表已經創建(通過第三方應用程序),我想從兩個表(即非規範化視圖)中獲取數據並進行一些處理。我希望這是有效的用例。嘗試使用但它沒有給出結果。直接在DB上觸發時生成的HQL查詢正常工作。 – angel

回答

0

使用的是什麼Hibernate文檔說,你所要做的

@Entity 
public class Troop { 
    @OneToMany(mappedBy="troop") 
    public Set<Soldier> getSoldiers() { 
    ... 
} 

@Entity 
public class Soldier { 
    @ManyToOne 
    @JoinColumn(name="troop_fk") 
    public Troop getTroop() { 
    ... 
}   

這使得雙向關係

0

是使用Hibernate,您可以創建模型/實體對象,如下面

@Entity 
    @Table(name="StudyCase") 
    public class StudyCase { 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Long id; 
    @Column(name="study_case_number") 
    private Long study_case_number; //You might try to use Integer of String as per your requirement 
     ... getter setter 
    } 

    @Entity 
    @Table(name="StudyCase") 
    public class Measurement { 
     @Id 
     @GeneratedValue 
     @Column(name = "id") 
     private Long id; 

     @ManyToOne 
     @JoinColumn(name="StudyCase") 
     private StudyCase studyCaseId 

     ... getter setter 
    }  

現在使用休眠查詢您可以編寫如下的查詢

String sql = "from Measurement as measurement " 
       + "inner join measurement.studyCaseId as studyCaseId " 
       + "where studyCaseId.study_case_number= :studyCaseNumber"; 
     Query query = getCurrentSession().createQuery(sql); 
     query.setParameterList("studyCaseNumber", studyCaseNumberLong); 
     List<Measurement> measurementList = query.list(); 

希望以上例子將幫助你 一切順利!

+0

感謝您的幫助,但我認爲您可能錯過了這裏的觀點!我所問的不是如何在兩個實體之間創建兩個很多的關係,而是問是否可以創建一個具有兩個實體的文件的對象,並且服務器只是查詢過度的。例如,讓我們假設存在一個研究案例對象和5個與它關聯的Measurement對象,當我想要查詢的結果時可以得到5個類型爲(mergeObject)的對象,這些對象將重複Studcase對象的字段測量結果的5倍不同的值。 – asdfsarandom

+0

你能告訴我我在這裏錯過了什麼? – Dev

+0

對不起,我正在嘗試這是很難解釋accuretly! – asdfsarandom

0

最後我最終使用spring-jpa,但以更緊湊的方式,我會說。 這裏是額外的代碼:

private DriverManagerDataSource dataSource; 
private JdbcTemplate jdbcTemplate; 

我塗蠟的方法手動初始化數據源:

public void initDataSource() 
    { 
    String url = "jdbc:sqlserver://localhost:1433;DatabaseName=testdb" ; 
    Properties properties = new Properties() ; 
    properties.setProperty("username", "actualUsername") ; 
    properties.setProperty("password", "actualpassowrd") ; 
    properties.setProperty("driverClassName", "com.microsoft.sqlserver.jdbc.SQLServerDriver") ; 
    properties.setProperty("dialect", "org.hibernate.dialect.SQLServerDialect") ; 
    dataSource = new DriverManagerDataSource(url, properties) ; 
} 

,我用它像這樣:

initDataSource() ; 
    jdbcTemplate = new JdbcTemplate(dataSource); 
    String sql = "select * from Measurement INNER JOIN StudyCase ON Measurement.study_case_number=StudyCase.study_case_number where " ; 
    List<DaoObject> result = this.jdbcTemplate.query(sql, new BeanPropertyRowMapper<DaoObject>(DaoObject.class)) ;