繁体   English   中英

用休眠连接两个表

[英]Join two tables with hibernate

我正在寻找一个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关系。

Table1.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;
}

Table2.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
}

此处检查完整代码。

这是一个JPA查询,它将与您的现有实体结构以及最新版本的hibernate一起使用。

从TableOneDao AS t1中选择t1.tableOneValue,t2.tableTwoValue。JOIN将TableTwoDao AS t2打开t1.table_one_id = t2.table_two_id其中t1.table_one_filter =吗?

您可以编写一个更好的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;

请参考此链接,并跳至提及结果类(构造函数表达式)的部分 希望能帮助到你。 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM