Java 加入hql hibernate所需的路径

Java 加入hql hibernate所需的路径,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我知道这个问题存在于SO中。然而,我已经阅读了许多寻找这个错误的帖子,我无法解决我的问题 我尝试为“多对多”关系执行一个内部联接,中间的表必须在它下面加下划线,如升级\u代码\u产品,但我在@Query上写了类似这样的内容,但失败了,错误类似于join hql hibernate的路径 我的问题是: @Query("SELECT p.serviceName, p.category, v.code from Product p " + " INNER JOIN PromotionCod

我知道这个问题存在于SO中。然而,我已经阅读了许多寻找这个错误的帖子,我无法解决我的问题

我尝试为“多对多”关系执行一个内部联接,中间的表必须在它下面加下划线,如升级\u代码\u产品,但我在
@Query
上写了类似这样的内容,但失败了,错误类似于join hql hibernate的
路径

我的问题是:

 @Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN PromotionCodeCategory cp ON p.id = cp.productId " 
    + " INNER JOIN Voucher v on v.id = cp.promotionCodeId " 
    + " WHERE v.code = ?1")
我也试过这样的方法:

@Query("SELECT p.serviceName, p.category, v.code from Product p INNER JOIN PromotionCodeProduct cp ON p.id = cp.productId INNER JOIN Voucher v on v.id = cp.promotionCodeId WHERE v.code = ?1")
@Table(name = "VOUCHER")
@DynamicUpdate
//@Data
@Setter
@Getter
public class Voucher extends Base {

    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinTable(name = "PROMOTION_CODE_PRODUCT",
               joinColumns =  @JoinColumn(name = "PROMOTION_CODE_ID"),
               inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
    private Set<Product> products;

    @Column(name = "CODE", unique = true)
    private String code;

    @Column(name = "TYPE", nullable = false)
    private String type;

    @Lob
    private String descriptions;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}



@Entity
@Table(name = "PRODUCT")
//@Data
@Setter
@Getter
@DynamicUpdate
public class Product extends Base {

    @ManyToMany(mappedBy = "products", fetch = FetchType.EAGER)
    private Set<Voucher> promotionCodes;

    @Column(name = "SERVICE_NAME", nullable = false)
    private String serviceName;

    @Column(name = "CATEGORY")
    private String category;

    @Column(name = "DESCRIPTION")
    private String description;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}

像这样的实体:

@Query("SELECT p.serviceName, p.category, v.code from Product p INNER JOIN PromotionCodeProduct cp ON p.id = cp.productId INNER JOIN Voucher v on v.id = cp.promotionCodeId WHERE v.code = ?1")
@Table(name = "VOUCHER")
@DynamicUpdate
//@Data
@Setter
@Getter
public class Voucher extends Base {

    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinTable(name = "PROMOTION_CODE_PRODUCT",
               joinColumns =  @JoinColumn(name = "PROMOTION_CODE_ID"),
               inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
    private Set<Product> products;

    @Column(name = "CODE", unique = true)
    private String code;

    @Column(name = "TYPE", nullable = false)
    private String type;

    @Lob
    private String descriptions;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}



@Entity
@Table(name = "PRODUCT")
//@Data
@Setter
@Getter
@DynamicUpdate
public class Product extends Base {

    @ManyToMany(mappedBy = "products", fetch = FetchType.EAGER)
    private Set<Voucher> promotionCodes;

    @Column(name = "SERVICE_NAME", nullable = false)
    private String serviceName;

    @Column(name = "CATEGORY")
    private String category;

    @Column(name = "DESCRIPTION")
    private String description;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}

@表(name=“凭证”)
@动态铜日期
//@资料
@塞特
@吸气剂
公共类凭证扩展基础{
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name=“促销\代码\产品”,
joinColumns=@JoinColumn(name=“促销代码”\u ID”),
inverseJoinColumns=@JoinColumn(name=“PRODUCT_ID”))
私人套装产品;
@列(name=“CODE”,unique=true)
私有字符串码;
@列(name=“TYPE”,nullable=false)
私有字符串类型;
@高球
私有字符串描述;
公共代码{
返回Objects.hashCode(getId());
}
}
@实体
@表(name=“产品”)
//@资料
@塞特
@吸气剂
@动态铜日期
公共类产品扩展基础{
@ManyToMany(mappedBy=“products”,fetch=FetchType.EAGER)
私人设置促销代码;
@列(name=“SERVICE\u name”,null=false)
私有字符串serviceName;
@列(name=“CATEGORY”)
私有字符串类别;
@列(name=“DESCRIPTION”)
私有字符串描述;
公共代码{
返回Objects.hashCode(getId());
}
}

请记住,hql连接与常规sql连接不同

使用hql可以对实体而不是表执行查询

因此,对实体中包含的字段执行联接

假设您的产品类包含一个名为“类别”的PromotionCodeCategory列表或集合,并且您的PromotionCodeCategory包含一个名为“凭单”的凭单列表或集合,则您的查询应如下所示:

@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.categories AS cp " 
    + " INNER JOIN cp.vouchers as v " 
    + " WHERE v.code = xxx")
@Entity
@Table(name = "products")
public class Product { 
  
    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "product_voucher",   // insert join table name here
        joinColumns = { @JoinColumn(name = "product_id") }, // insert product column name from join table here 
        inverseJoinColumns = { @JoinColumn(name = "voucher_id") } // // insert voucher column name from join table here
    )
    Set<Voucher> vouchers = new HashSet<>();
    
    // standard constructor/getters/setters
}

    
@Entity
@Table(name = "vouchers")
public class Voucher {    
  
    @ManyToMany(mappedBy = "vouchers")
    private Set<Product> products = new HashSet<>();
     
    // standard constructors/getters/setters   
}
@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.vouchers AS v " 
    + " WHERE v.code = xxx")

编辑 需要注意的是,只有两个实体:产品和凭证。因此,您的类应该如下所示:

@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.categories AS cp " 
    + " INNER JOIN cp.vouchers as v " 
    + " WHERE v.code = xxx")
@Entity
@Table(name = "products")
public class Product { 
  
    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "product_voucher",   // insert join table name here
        joinColumns = { @JoinColumn(name = "product_id") }, // insert product column name from join table here 
        inverseJoinColumns = { @JoinColumn(name = "voucher_id") } // // insert voucher column name from join table here
    )
    Set<Voucher> vouchers = new HashSet<>();
    
    // standard constructor/getters/setters
}

    
@Entity
@Table(name = "vouchers")
public class Voucher {    
  
    @ManyToMany(mappedBy = "vouchers")
    private Set<Product> products = new HashSet<>();
     
    // standard constructors/getters/setters   
}
@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.vouchers AS v " 
    + " WHERE v.code = xxx")

希望这有帮助

我有3个表,一个用于凭证,一个用于产品,另一个用于联接表,如凭证产品:产品id和凭证id我知道。如果您使用的是hibernate,那么还必须具有具有hibernate映射的Product、PromotionCodeCategory和凭单类。此外,您的产品类必须具有PromotionCodeCategory或Set字段,并且您的PromotionCodeCategory类应该具有凭证或Set字段,以便使用hibernate和HQL执行内部联接您可以添加产品吗,PromotionCodeCategory和凭证类以及错误的完整堆栈?你能喜欢我刚写的实体吗?对于许多人来说,这只是两个实体,只有那个,只有产品和凭证类,然后创建JoinTable