开发者社区 问答 正文

休眠一对一条件获取

我在汽车和人表之间使用休眠一对一映射。但是一个人可能有车,也可能没有车。现在,当使用休眠条件从人员表中获取记录时,我只想获取拥有汽车的人员,即人员表中仅存在对应于汽车表中条目的那些条目。如何使用休眠标准/别名完成此操作?

下面是一段代码。请协助获取结果的标准或别名:

@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;

}

展开
收起
几许相思几点泪 2019-12-03 15:59:19 288 分享 版权
阿里云 AI 助理回答

在Hibernate中,如果你想基于关联关系的存在与否来过滤查询结果,可以使用@Where注解或者直接在查询时使用HQL(Hibernate Query Language)或Criteria API来实现条件筛选。对于你的需求,即只获取那些关联有汽车的人员记录,这里提供两种方法:

方法1: 使用@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时都会应用这个条件,包括一对多或多对一的情况。如果这不符合其他查询场景的需求,可能需要考虑第二种方法。

方法2: 在查询时指定条件

如果你不想永久性地改变映射关系,可以在执行查询时手动添加条件。使用HQL或Criteria API都可以达到目的。

使用HQL:

String hql = "FROM Person p WHERE p.car IS NOT NULL";
List<Person> personsWithCars = entityManager.createQuery(hql, Person.class).getResultList();

使用Criteria API:

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();

这两种查询方式允许你灵活地根据具体需求调整查询条件,而不影响到实体类的定义。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: