Java 加入hql hibernate所需的路径
我知道这个问题存在于SO中。然而,我已经阅读了许多寻找这个错误的帖子,我无法解决我的问题 我尝试为“多对多”关系执行一个内部联接,中间的表必须在它下面加下划线,如升级\u代码\u产品,但我在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
@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