[英]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.