HQL策略等于嵌入实体

时间:2015-09-09 15:14:08

标签: java jpa orm equals

我很好奇HQL如何在实体实例之间断言相等。

我们说我有一个名为Person的实体

@Entity
public class Person{

  @Id
  private Long id;

  private String name;
}

和部门

@Entity
public class Department {

  @Id
  private Long id;

  @ManyToOne
  private Person person;
}

如果我做以下陈述,那就没关系了:

Query query = getSession().createQuery("from Department d where d.person = ?");
query.setProperty(0,new Person(1L)); 

但是,如果我有一个嵌入式实体并且没有定义pk怎么办?像

@Embeddable
public class Adress {

 private String email;
 private String street;  
 private Long identifier;

}

@Entity
public class Person{

  @Id
  private Long id;

  private String name;

  @Embedded
  private Address address;

}

会有任何办法,所以我可以告诉JPA让它工作:

Query query = getSession().createQuery("from Person p where p.address = ?");
query.setProperty(0,new Address(1L)); 

即使它不完全是主键吗? 当然,如果我尝试了p.adress.identifier,然后只传递了Long值,我知道我会工作,但重点是,我可以告诉JPA提供商它将如何实现这一目标。实施'平等我的方式? 谢谢大家

1 个答案:

答案 0 :(得分:0)

不,它不受支持,一般来说很难或者在某些情况下没有意义,比如Embeddable中有集合。

如果您发现经常需要这样做,请考虑将此类嵌入式转换为custom user types。然后,您可以按照描述的方式进行比较。