【问题标题】:Hibernate, joining two columns against one休眠,将两列对一列
【发布时间】:2020-02-24 08:31:47
【问题描述】:

我有这样的表: 表 1:用户

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int         | NO   | PRI | NULL    | auto_increment |
| name       | varchar(45) | NO   |     | NULL    |                |
| lastname   | varchar(45) | NO   |     | NULL    |                |
| birth_date | date        | NO   |     | NULL    |                |
| is_deleted | tinyint     | NO   |     | 0       |                |
+------------+-------------+------+-----+---------+----------------+

实体1:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;
    @Column(name = "name", nullable = false)
    private String name;
    @Column(name = "lastname", nullable = false)
    private String lastName;
    @Column(name = "birth_date")
    private Date birthDate;
    @Column(name = "is_deleted")
    private boolean isDeleted;

表 2:友谊

+----------------+-----------+------+-----+-------------------+-------------------+
| Field          | Type      | Null | Key | Default           | Extra             |
+----------------+-----------+------+-----+-------------------+-------------------+
| first_user_id  | int       | NO   |     | NULL              |                   |
| second_user_id | int       | NO   |     | NULL              |                   |
| timestamp      | timestamp | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+----------------+-----------+------+-----+-------------------+-------------------+

实体2:

@Entity
@Table(name = "friendships")
public class Friendship {
    @Id
    @Column(name = "first_user_id")
    private int firstUserId;
    @Id
    @Column(name = "second_user_id")
    private int secondUserId;

我必须让所有用户的朋友都使用 Hibernate,而不需要本地 SQL 查询。用户 ID 可能出现在第二张表的两列中。通过 JDBC 和 SQL,我使用了这个查询:

SELECT u.id, u.name, u.lastname FROM users u
 INNER JOIN friendships f
  ON u.id = f.first_user_id OR u.id = f.second_user_id
  WHERE f.second_user_id = :userId AND u.id = f.first_user_id
UNION
SELECT u.id, u.name, u.lastname  FROM users u
 INNER JOIN friendships f
  ON u.id = f.first_user_id OR u.id = f.second_user_id
  WHERE f.first_user_id = :userId AND u.id = f.second_user_id;

Hibernate 可以做到这一点吗?

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    首先,我认为您的查询可以简化为

    SELECT u.id, u.name, u.lastname FROM users u
    INNER JOIN friendships f
    ON u.id = f.first_user_id OR u.id = f.second_user_id
    WHERE (f.second_user_id = :userId AND u.id = f.first_user_id)
    OR (f.first_user_id = :userId AND u.id = f.second_user_id)
    

    如果我没记错的话,Hibernate 查询应该是这样的

    SELECT u.id, u.name, u.lastName FROM User u 
    INNER JOIN Friendship f 
    ON u.id = f.firstUserId OR u.id = f.secondUserId 
    WHERE (f.secondUserId = :userId AND u.id = f.firstUserId) 
    OR (f.firstUserId = :userId AND u.id = f.secondUserId)
    

    【讨论】:

      【解决方案2】:

      如果您可以将 Friendship 实体更改为:

      @Entity
      @Table(name = "friendships")
      public class Friendship {
          @Id
          private int id;
      
          @JoinColumn(name = "first_user")
          @ManyToOne(fetch = FetchType.LAZY)
          private Userss firstUser;
      
          @JoinColumn(name = "second_user")
          @ManyToOne(fetch = FetchType.LAZY)
          private Userss secondUser;
      }
      

      然后您可以简单地使用 Hibernate 查询语言 (HQL) 从友谊表中获取数据:Query query = session.createQuery("from Employee");

      【讨论】:

        猜你喜欢
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        相关资源
        最近更新 更多