我正在寻找创建一个DAO,它表示用Java Hibernate连接两个表。下面是我想表示的SQL(如果重要的话,请参见Postgres9.6):
SELECT tableOneValue, tableTwoValue
FROM table_one, table_two
WHERE table_one_filter = 2 AND table_one_id = table_two_id;
这些桌子是一对一的关系。
表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的所有行。 最佳答案
您需要使用@OneToOne
和@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
}
检查完整代码here。