【问题标题】:Hibernate Criteria to pull records from OneToMany Relations从 OneToMany 关系中提取记录的休眠标准
【发布时间】:2020-06-30 19:48:27
【问题描述】:

我正在传递一组车辆名称,例如['car','jeep','truck','bike'],并希望使用条件查询在此列表中选择拥有vehicles 的车主,这里的车主可以拥有多个vahicles (OneToMany)。我有一个限制,我需要使用 Criteria 查询。

class Owner {

    @ID
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "owner_id")
    private Long ownerId;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "owner_id")
    private Set<Vehicles> vehicles;

}

class Vehicles {

    @ID
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "vehicle_id")
    private Long vehicleId;

    @ManyToOne
    @JoinColumn(name = "owner_id")
    private Owner owner;

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

}

以下是我尝试过但没有成功的方法

Criteria criteria = getSession().createCriteria(Owner.class);
criteria.createAlias("vehicles", "vehicles");
criteria.add(Restrictions.in("vehicles.vehicleName", setOfVehicles));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

【问题讨论】:

  • 你用的是什么休眠版本?
  • 休眠版本为 5.x

标签: hibernate hibernate-criteria


【解决方案1】:

首先,您的映射看起来不正确。 OwnerVehicles 之间存在双向关联。因此,只有@ManyToOne 一侧应由@JoinColumn 注释。我将使用更正后的方式映射如下:

@Entity
@Table
public class Owner
{
   @Id
   @Column(name = "own_id")
   private Long id;

   @OneToMany(mappedBy = "owner")
   private Set<Vehicles> vehicles;
}

@Entity
@Table
public class Vehicles
{
   @Id
   @Column(name = "veh_id")
   private Long id;

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

   @ManyToOne
   @JoinColumn(name = "veh_own_id")
   private Owner owner;
}

接下来我要强调的是,您尝试使用已弃用的 Hibernate org.hibernate.Criteria API。我将为Criteria API 提供一个示例。因此,查询将具有以下视图:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Owner> criteria = builder.createQuery(Owner.class);
Root<Owner> root = criteria.from(Owner.class);
SetJoin<Owner, Vehicles> vehs = (SetJoin<Owner, Vehicles>) root.fetch(Owner_.vehicles);

criteria
   .select(root)
   .distinct(true)
   .where(
      vehs.get(Vehicles_.NAME).in(Arrays.asList("car", "jeep", "truck", "bike"))
   );

List<Owner> deps = session.createQuery(criteria).getResultList();

Owner_Vehicles_ 类属于所谓的JPA static metamodelthis 文章中描述了为什么需要强制转换 (SetJoin&lt;Owner, Vehicles&gt;) root.fetch(Owner_.vehicles)(请参阅定义 JOIN FETCH 子句部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2011-12-29
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多