繁体   English   中英

加入 hql 休眠的预期路径

[英]Path expected for join hql hibernate

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

我尝试为“多对多”关系执行内部连接,中间表必须像promotion_code_product这样的下划线,但是我在@Query写了@Query东西并且失败了,错误是类似于Path expected for 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());
    }

}

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

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

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

假设您的产品类包含一个名为“categories”的 PromotionCodeCategory 列表或 Set,并且您的 PromotionCodeCategory 包含一个名为“vouchers”的 List 或 Set of Voucher,那么您的查询应如下所示:

@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")

编辑

注意到只有两个实体:Product 和 Voucher。 因此,您的课程应如下所示:

@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")

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM