【问题标题】:Is it necessary to explicitly indicate association part by joining in Hibernate?加入Hibernate是否需要明确指出关联部分?
【发布时间】:2020-07-01 13:54:40
【问题描述】:

我正在帮助我的朋友完成一项训练任务。方法如下。

有两个实体:UserCar,它们是一对一的关系。

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private Car car;

汽车类:

@Entity
@Table(name = "cars")
public class Car {

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

@Column(name = "name")
private String name;

@OneToOne(mappedBy = "car")
private User user;

@Override
public User getUserByAutoName(String name) {
   User user = sessionFactory.getCurrentSession()
        .createQuery("SELECT u from User u JOIN Car c on u.id = c.id where c.name = :n", User.class)
        .setParameter("n", name)
        .getSingleResult();
return user;

据我所知,我们不必明确指出关联部分:

on u.id = c.id

Hibernate 在后台为我们完成了这项工作。但是在这个例子中,当我不这样做时,它会毁掉。 你能帮我清除这一刻吗? :)

【问题讨论】:

  • 可以只添加实体的声明吗?
  • 测试我在评论中的建议
  • 好的,但问题是我们何时必须明确地这样做,在哪些关系类型以及何时可以放弃它
  • 您可以选择使用原生 SQL 或利用 HQL 语言

标签: java sql spring hibernate jpa


【解决方案1】:

由于您的 User @Entity 在您的 Car 实体的 id 列上指定了 @JoinColumn,因此您无需指定查询本身中明确的连接条件。如果您没有指定 @JoinColumn,则必须在查询本身中明确连接条件。

@JoinColumn 注释指示实体之间的主键/外键关系。有趣的是,Hibernation documentation 没有提供关于如何使用它的解释性信息。

您能否提供未指定关联的示例?我在你的问题中没有看到。无论哪种方式,我都建议为您的 .createQuery 尝试这个:

...
 .createQuery(
  "SELECT u 
   from User u 
   join u.car c 
   where u.name = :n", User.class)
...

【讨论】:

    【解决方案2】:

    这是因为您不明确应该将哪个字段用作连接的参考。假设你的 User 类有一个名为 @OneToOne Car car 的字段,你应该尝试这个查询:

    SELECT u FROM User u JOIN u.car as c WHERE c.name = :n
    

    【讨论】:

      【解决方案3】:

      试试看:

      User user = sessionFactory.getCurrentSession()
          .createQuery("SELECT u from User u JOIN u.car as car where car.name = :n", User.class)
          .setParameter("n", name)
          .getSingleResult();
      

      因为 Car 是 User 实体中的一个属性

      【讨论】:

        猜你喜欢
        • 2013-04-07
        • 2016-05-07
        • 2022-08-16
        • 1970-01-01
        • 2019-07-11
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多