Java 如何使用hibernate连接四个表

Java 如何使用hibernate连接四个表,java,php,hibernate,laravel,Java,Php,Hibernate,Laravel,我有四张桌子需要加入。这四个表格是: 产品 服务 服务类型 服务时间 产品有服务,服务有类型和持续时间 用户选择产品、类型、服务和服务期限 如果服务在所选类型和持续时间内不可用,我希望能够获得优先级较低的服务(优先级是服务类型表中的属性) 在php(Laravel)中,我可以这样加入: DB::table('product') ->join('product_service', 'product_service.product_id', '=', 'product.id')

我有四张桌子需要加入。这四个表格是:

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

    用户选择产品、类型、服务和服务期限

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

    在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();
    
    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;
    }
    
    因此,“持有”对另一个对象的引用的对象就是产品对象。因此,我不知道如何为优先级低于所选产品的产品获得服务


    我想用criteria或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) ;
    
    但是我不明白你的意思,为什么你在
    产品
    上使用
    而不是
    产品服务
    ?,因为你需要
    产品服务
    的详细信息

    您可以使用querycriteria.html,这是它的文档->
    或者您可以使用hql->来实现您的结果

    显然,JPA标准API不支持我在使用复合PK模式时所需的内容。我在某处发现了这个。因此,我发现最好的解决方案是使用HQL:

    Query q = session.createQuery("select s "
                + "from Service s "
                + "join s.productService as ps "
                + "join s.type as t "
                + "where s.duration = :durationId "
                + "and ps.id.product.id = :productId "
                + "and t.priority <= :priorityValue "
                + "order by t.priority desc");
        q.setLong("durationId", durationId);
        q.setInteger("priorityValue", priorityValue);
        q.setLong("productId", productId);
    
        return (Service) q.setMaxResults(1).uniqueResult();
    
    Query q=session.createQuery(“选择s”
    +“来自服务s”
    +“以ps身份加入s.productService”
    +“将s.type作为t连接”
    +“其中s.duration=:durationId”
    +“和ps.id.product.id=:productId”
    
    + "和t.priority是的,您可以这样做。您的实体类是否已经使用
    @OneToOne
    /
    @OneToMany
    /
    @ManyToOne
    关系进行了设置?Hibernate文档清楚地解释了如何处理关系。您看过Hibernate文档了吗?@deanclk是的,它们是。我不介意在其他时间发生这种情况我只是想得到相同的结果。@user3552551那么你可以使用我上面提到的DetachedCriteria。我想我是从产品方面开始的,因为这是定义多对多关系的地方。我将尝试你的解决方案,谢谢。
    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) ;
    
    Query q = session.createQuery("select s "
                + "from Service s "
                + "join s.productService as ps "
                + "join s.type as t "
                + "where s.duration = :durationId "
                + "and ps.id.product.id = :productId "
                + "and t.priority <= :priorityValue "
                + "order by t.priority desc");
        q.setLong("durationId", durationId);
        q.setInteger("priorityValue", priorityValue);
        q.setLong("productId", productId);
    
        return (Service) q.setMaxResults(1).uniqueResult();