Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有必要通过加入Hibernate来明确指示关联部分?_Java_Sql_Spring_Hibernate_Jpa - Fatal编程技术网

Java 是否有必要通过加入Hibernate来明确指示关联部分?

Java 是否有必要通过加入Hibernate来明确指示关联部分?,java,sql,spring,hibernate,jpa,Java,Sql,Spring,Hibernate,Jpa,我在帮助我的朋友完成一项训练任务。方法如下 有两个实体:用户和汽车,它们与一对一的关系相关联 @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "id

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

有两个实体:用户和汽车,它们与一对一的关系相关联

@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在引擎盖下为我们做这件事。但在这个例子中,如果我不这样做,它就会毁坏。
你能帮我清理一下这个时刻吗?:)

这是因为您不确定应该使用哪个字段作为联接的引用。假设您的
用户
类有一个名为
@OneToOne Car
的字段,您应该尝试此查询:

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

这是因为您不确定应该使用哪个字段作为联接的引用。假设您的
用户
类有一个名为
@OneToOne Car
的字段,您应该尝试此查询:

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

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 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是用户实体中的一个属性

,因为您的用户@实体在Car实体的id列上指定了一个属性,所以您不需要在查询本身中显式指定联接条件。如果没有指定@JoinColumn,则必须在查询本身中明确连接条件

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

您能否提供一个不指定关联的示例?我在你的问题中看不到这一点。无论哪种方式,我都建议您在.createQuery中尝试以下操作:

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

由于您的用户@实体在汽车实体的id列上指定了一个连接条件,因此不需要在查询本身中明确指定连接条件。如果没有指定@JoinColumn,则必须在查询本身中明确连接条件

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

您能否提供一个不指定关联的示例?我在你的问题中看不到这一点。无论哪种方式,我都建议您在.createQuery中尝试以下操作:

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

你能添加实体声明吗?@AyoubMkharbach不测试我在评论中的建议OK,但问题是我们什么时候必须明确地这样做,在哪些关系类型中以及何时可以删除它您可以选择使用本机SQL或利用HQL语言您可以只添加实体声明吗?@Ayubmkharbach测试我在评论中提出的建议OK,但问题是我们何时必须明确地这样做,在哪些关系类型中以及何时可以删除它您可以选择使用本机SQL或利用HQL语言