首页 > 解决方案 > 使用休眠连接两个表

问题描述

我正在寻找一个 DAO,它表示两个表与 Java Hibernate 的连接。这是我想代表的 SQL(Postgres 9.6 很重要):

SELECT tableOneValue, tableTwoValue
FROM table_one, table_two
WHERE table_one_filter = 2 AND table_one_id = table_two_id;

这些表具有 OneToOne 关系。

表1.java

@Entity
@Data
@Table(name="table_one")
public class TableOneDao implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "table_one_id")
    private int tableOneId;

    @Column(name = "table_one_value")
    private String tableOneValue;


    @Column(name = "table_one_filter")
    private int tableOneFilter;
}

表2.java

@Entity
@Data
@Table(name="table_two")
public class TableTwoDao implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "table_twp_id")
    private int tableTwpId;

    @Column(name = "table_two_value")
    private String tableTwoValue;
}

我对休眠很陌生,所以也许这不是正确的思考方式。我想做的是定义一个我可以做的 SomeDao 类:daoManager.findAll(SomeDao.class, Pair.of("tableOneFilter", 2));

这将返回一个List<SomeDao>我们得到满足 tableOneFilter == 2 的所有行的地方。

标签: javapostgresqlhibernatehibernate-mapping

解决方案


您需要使用@OneToOneand@JoinColumn注释。

特别注意userDetail属性映射。

例如,用户类:

@Entity
@Table(name = "USERS")
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_ID")
   private long id;

   @Column(name = "USERNAME", nullable = false, unique = true)
   private String username;

   @Column(name = "PASSWORD")
   private String password;

   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name="USR_DET_ID")
   private UserDetail userDetail;

   // Add Constructor, Setter and Getter methods
}

而这个用户详细信息类:

@Entity
@Table(name = "USER_DETAILS")
public class UserDetail {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_DET_ID")
   private long id;

   @Column(name = "FIRST_NAME")
   private String firstName;

   @Column(name = "LAST_NAME")
   private String lastName;

   @Column(name = "EMAIL")
   private String email;

   @Column(name = "DBO")
   private LocalDate dob;

   // Add Constructor, Setter and Getter methods
}

在此处查看完整代码。


推荐阅读