我在汽车和人表之间使用休眠一对一映射。但是一个人可能有车,也可能没有车。现在,当使用休眠条件从人员表中获取记录时,我只想获取拥有汽车的人员,即人员表中仅存在对应于汽车表中条目的那些条目。如何使用休眠标准/别名完成此操作?
下面是一段代码。请协助获取结果的标准或别名:
@Getter
@Setter
@Entity
@Table(name =“ Person”)公共类Person实现了Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "Person_ID")
private Long personId;
@OneToOne(mappedBy =“ personAsset”,级联= CascadeType.ALL)私家车;
}
@Getter
@Setter
@Entity
@Table(name = "Car")
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "Car_ID")
private Long carId;
@OneToOne
@JoinColumn(name = "Person_ID")
private Person personAsset;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Hibernate中,如果你想基于关联关系的存在与否来过滤查询结果,可以使用@Where
注解或者直接在查询时使用HQL(Hibernate Query Language)或Criteria API来实现条件筛选。对于你的需求,即只获取那些关联有汽车的人员记录,这里提供两种方法:
@Where
注解在Person
实体类中的Car
属性上添加@Where
注解,以确保加载的Car
对象不为null。
@Getter
@Setter
@Entity
@Table(name = "Person")
public class Person implements Serializable {
// ... 其他属性 ...
@OneToOne(mappedBy = "personAsset", cascade = CascadeType.ALL)
@Where(clause = "Car_ID IS NOT NULL") // 添加此行来过滤空的Car关联
private Car car;
}
需要注意的是,@Where
是全局过滤器,这意味着每次加载Person
时都会应用这个条件,包括一对多或多对一的情况。如果这不符合其他查询场景的需求,可能需要考虑第二种方法。
如果你不想永久性地改变映射关系,可以在执行查询时手动添加条件。使用HQL或Criteria API都可以达到目的。
String hql = "FROM Person p WHERE p.car IS NOT NULL";
List<Person> personsWithCars = entityManager.createQuery(hql, Person.class).getResultList();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Predicate hasCar = builder.isNotNull(root.get("car"));
query.select(root).where(hasCar);
List<Person> personsWithCars = entityManager.createQuery(query).getResultList();
这两种查询方式允许你灵活地根据具体需求调整查询条件,而不影响到实体类的定义。