gpt4 book ai didi

java - 如何使用hibernate连接四个表

转载 作者:行者123 更新时间:2023-12-02 13:36:39 26 4
gpt4 key购买 nike

我有四张 table 需要加入。这四个表是:

  1. 产品
  2. 服务
  3. 服务类型
  4. service_duration

产品有服务,服务有类型和持续时间。

用户选择产品、类型、服务以及服务期限。

如果服务在所选类型和持续时间内不可用,我希望能够获得具有较低优先级类型的服务(优先级是 service_type 表中的属性)。

在 php(Laravel) 中,我可以像这样加入:

DB::table('product')
->join('product_service', 'product_service.product_id', '=', 'product.id')
->join('service', 'service.id', '=', 'product_service.service_id')
->join('service_type', 'service.type_id', '=', 'service_type.id')
->join('service_duration', 'service.duration_id', '=', 'service_duration.id')
->where('product.id', id)
->where('service_type.priority', '<', priority)
->where('service_duration.duration', duration)
->where('maintenance.active', 1)
->orderBy('service_type.priority', 'desc')
->select('service.*')
->first();

如何使用 Hibernate 实体标准来做到这一点?我想从产品方面开始加入,但最终选择服务。

我的关系定义如下:

产品类别

 @Entity
@Table(name = "product")
public class product implements Serializable {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "id.product", cascade=CascadeType.ALL)
private Set<ProductService> services = new HashSet<ProductService>();
}

产品服务类:

@Entity
@Table(name = "product_service")
@AssociationOverrides({ @AssociationOverride(name = "id.service", joinColumns = @JoinColumn(name = "service_id")),
@AssociationOverride(name = "id.product", joinColumns = @JoinColumn(name = "product_id"))})

public class ProductService implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId
private ProductServicePK id = new ProductServicePK();


@Column(name = "price")
private Float price;

@Column(name = "code")
private String code;
}

ProductServicePK 类:

@Embeddable
public class ProductServicePK implements Serializable {

private static final long serialVersionUID = 1L;

@ManyToOne
private Product product;

@ManyToOne
private Service service;
}

服务等级:

   @Entity
@Table(name = "service")
public class Service implements Serializable {

@Id
@Column(name = "id")
private Long id;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "type_id")
private ServiceType type;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "duration_id")
private ServiceDuration duration;
}

因此,“保存”对另一个对象的引用的对象是产品对象。所以我不知道如何获得优先级低于所选产品的服务。

我想使用标准或 HQL 来执行此操作。

最佳答案

您的 Hibernate 分离标准会喜欢:

DetachedCriteria criteria = DetachedCriteria.forClass(Product.class,     "product")
.criteria.createAlias("product.product_service", "productService")
.createAlias("productService.service","service")
.createAlias("service.service_type","serviceType")
.createAlias("service_duration","serviceDuration")
.add(Restrictions.eq("product.id", id))
.add(Restrictions.gt("serviceType.priority", priority))
.add(Restrictions.eq("serviceDuration.duration", duration))
.setProjection(add your productService projection here)
getExecutableCriteria(session).SetMaxResults(1) ;

但我不明白你的意思,为什么你在 product 上使用 from query 而不是 product_service?,因为你需要 产品服务详细信息。

你可以使用querycriteria.html,这是它的文档-> https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html或者您可以使用 hql -> https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html为了达到你的结果。

关于java - 如何使用hibernate连接四个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42958104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com