【问题标题】:How to query hibernate ManyToMany column using sql如何使用 sql 查询休眠多对多列
【发布时间】:2021-05-31 05:33:41
【问题描述】:

我正在使用 java hibernate 来存储我的数据实体。我想知道使用 postgresql-psql 命令在 @ManyToMany 列中选择数据的 sql 命令。

对于普通列,我可以运行:

SELECT id FROM university;

但现在我有以下大学实体:

@Entity
@Table(name = "university")
public class University {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinColumn(name="students" /* referencedColumnName="id" */)
    private List<Student> students;
}
@Entity
@Table(name = "student", uniqueConstraints = { @UniqueConstraint(columnNames={"name"})})
public class Student
{
    @Id
    private Long id;

    @NotBlank
    @NotNull
    private String       name;
}

问题是,我不知道学生列表在psql中叫什么。

当我跑步时:

SELECT students FROM university;

我明白了:

ERROR:  column "students" does not exist

当我输入时:

\d university

我得到(不是实际数据:对学生/大学示例匿名的数据):

      Column      |            Type             | Collation | Nullable | Default 
------------------+-----------------------------+-----------+----------+---------
 id               | bigint                      |           | not null | 
Indexes:
    "university_pkey" PRIMARY KEY, btree (id)
    "uk_rwpd2frv6wtkgqtxn3envk3i8" UNIQUE CONSTRAINT, btree (name)
Referenced by:
    TABLE "university_students" CONSTRAINT "fkdkjk4jgutu64g937gkknybax2" FOREIGN KEY (university) REFERENCES university(id)

【问题讨论】:

    标签: java sql postgresql hibernate


    【解决方案1】:

    你有一个表'university_students',你能做'select * from university_students'吗

    我认为你有这样的结构:

    学生:

    id name
    0 first_student

    大学:

    id
    3

    大学学生:

    university_id students_id
    3 0

    所以你唯一需要做的就是: SELECT * FROM student WHERE id IN (SELECT students_id FROM university_students WHERE university_id = 3)

    这将在大学学生表中搜索大学ID等于3的所有学生ID,所有将与表学生匹配。

    如果您只想将他们的名字替换为 *name,如下所示: SELECT name FROM student WHERE id IN (SELECT students_id FROM university_students WHERE university_id = 3)

    【讨论】:

    • 我可以,是的!:database=&gt; select * from university_students; university_id | students_id --------------------+--------- 3 | 3 3 | 2 4 | 4 4 | 2 5 | 3 5 | 2 (6 rows)
    • 那么,我怎样才能让只有一所大学的所有学生?最好列出他们的名字。
    • 我改变了我的答案并添加了一个新的。
    【解决方案2】:

    好的得到了我想要的,灵感来自:https://stackoverflow.com/a/3486662/2396744

    鉴于:

    大学:

    database=> SELECT id FROM university;
     id 
    ----
      2
      3
      4
      5
    (4 rows)
    

    学生:

    database=> SELECT id,name FROM students;
     id | name       
    ----+----------
      4 | Jack
      3 | Jill
      2 | Jonas
    (3 rows)
    

    大学学生:

    database=> SELECT * FROM university_students;
     university_id | students_id 
    ---------------+---------
                 3 |       3
                 3 |       2
                 4 |       4
                 4 |       2
                 5 |       3
                 5 |       2
    (6 rows)
    

    查询变为:

    database=> SELECT u.id,us.university_id,us.students_id,s.name
    FROM students as s, university as u, university_students as us
    WHERE u.id = 5
    AND us.university_id = u.id
    AND us.student_id = s.id;
     id | university_id | student_id | name     
    ----+---------------+------------+----------
      5 |             5 |          3 | Jill
      5 |             5 |          2 | Jonas
    (2 rows)
    

    【讨论】:

      【解决方案3】:

      你可以并且你真的应该学习使用java spring boot的JpaRepository,它易于使用,你可以用它做很多事情,例如我有这个类:Client.java

      @Entity
      public class Client {
          @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
          @Column(unique = true, nullable = false) private String email, username;
          @Column(unique = true) private String phone;
          @Column(nullable = false) private String password, firstName, lastName;
          private boolean active;
          private long timestampCreation;
          private double coefficientReducingBuyer;
          private long score;
          // User privileges, roles, Address
          @ManyToMany(mappedBy = "clients", fetch = FetchType.EAGER) private Set<Privilege> privileges;
          @ManyToOne(fetch = FetchType.EAGER) private Role role;
           @OneToMany(mappedBy = "client", fetch = FetchType.EAGER, cascade = CascadeType.ALL) private Set<AddressClient> addressClients;
          // Market
          @OneToMany(fetch = FetchType.EAGER) private Set<Order> orders;
          @OneToOne(mappedBy = "client", cascade = CascadeType.ALL) private ShoppingCart shopping;
          @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) private Set<Favorite> favorites;
      }
      
      public interface ClientRepository extends JpaRepository<Client, Integer> {
          // Find all client by phone number
          Client findByPhone(String phone);
          // Find all client by phone number which is containing some element of my string
          List<Client> findByPhoneIsContaining(String phone);
          // Same but ignoring capital letter a and A is the same here
          List<Client> findByPhoneIgnoreCaseIsContaining(String phone);
          // Find by other table
          List<Client> findByRole(Role role);
          // Find by other table with a specific value in it
          Set<Client> findByPrivileges_Name(String privilege);
      }
      

      您不需要添加@Table,仅当您想更改表的名称时。

      这里我的表将命名为client,但是当我这样做时我可以将名称更改为user@Table(name="user"),所以当你不需要它时不要使用@Table

      【讨论】:

      • 我的示例中的数据是匿名的,实际上我们在数据库中的名称与类名不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多