2015-04-17 142 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)) ; 
相关问题