我希望创建一个DAO,它表示使用Java Hibernate连接两个表。这是我想表达的SQL(重要的是Postgres 9.6):
Student
这些表具有OneToOne关系。
Table1.java
SELECT tableOneValue, tableTwoValue
FROM table_one, table_two
WHERE table_one_filter = 2 AND table_one_id = table_two_id;
Table2.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;
}
我对冬眠很新,所以也许这不是用它思考的正确方法。我想做的是定义一个SomeDao课程,我可以做:@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;
}
这将返回daoManager.findAll(SomeDao.class, Pair.of("tableOneFilter", 2));
,我们得到满足tableOneFilter == 2的所有行。
答案 0 :(得分: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。
答案 1 :(得分:0)
这是一个JPA查询,它将与您现有的实体结构一起使用,并使用最新版本的hibernate。
SELECT t1.tableOneValue,t2.tableTwoValue FROM TableOneDao AS t1 JOIN TableTwoDao AS t2 ON t1.table_one_id = t2.table_two_id 在哪里t1.table_one_filter =?
答案 2 :(得分:0)
你可以编写一个更好的JPQL语句。以下是示例解决方案:
SELECT NEW com.test.package.dao(t1.valueOne, t2.valueTwo)
FROM table_one t1 JOIN table_two t2
WHERE t1.filter = 2 AND t1.id = t2.id;
请参阅this link并跳转到提及结果类(构造函数表达式)的部分。希望能帮助到你。感谢。