Hibernate映射一个类到两个表(两个表有多对一的关系)

时间:2015-04-17 14:32:01

标签: java spring hibernate jpa

我正在使用Hibernate 4.3.6
我有一个名为StudyCase的实体映射到名为StudyCase的数据库中的表 ,我还得到了另一个实体名称Measurement,用数据库中的表格调用了Measurement。每个StudyCase对象都可以与许多Measurement对象相关联,问题是这个。 我想在一个名为mergedEntity的新实体中映射两个表,并使用来自两个表的列查询它,结果将是具有一对一关系的对象列表与具有相同约束的Measurement对象一起但也将分配他们所属的StudyCase对象的信息。

我在春季jpa做了类似的工作:

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实现相同的功能。 谢谢 !

3 个答案:

答案 0 :(得分:0)

使用Hibernate Documentation所说的,你必须这样做

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

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

这会产生双向关系

答案 1 :(得分: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
    }     

现在使用Hibernate查询您可以编写如下的查询

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();

希望以上示例将帮助您 一切顺利!!!

答案 2 :(得分: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)) ;