Java Hibernate是否从连接到错误列的命名查询生成查询?
我正在使用命名查询(Hibernate4)Java Hibernate是否从连接到错误列的命名查询生成查询?,java,hibernate,jpa,hibernate-mapping,named-query,Java,Hibernate,Jpa,Hibernate Mapping,Named Query,我正在使用命名查询(Hibernate4) @Entity @NamedQuery( name = "findAllProduct", query = "SELECT PC.pincode,PO.description" +" FROM PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION PVPOL" +" INNER JOIN PVPOL.paymentId PID"
@Entity
@NamedQuery(
name = "findAllProduct",
query = "SELECT PC.pincode,PO.description"
+" FROM PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION PVPOL"
+" INNER JOIN PVPOL.paymentId PID"
+" INNER JOIN PVPOL.pincode PC"
+" INNER JOIN PVPOL.paymentOptions PO"
+" where PVPOL.id = :id"
)
public class PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION extends baseEntity.Entity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="Payment_Id")
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="id")
private Set<Product_Catalog_Vendor> paymentId;
@Column(name="pincode_id")
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="pincode_id")
private Set<Pincodes> pincode;
@Column(name = "payment_options")
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="paymentOptions")
private Set<Payment_Options> paymentOptions;
//Protected setter getter here
}
而不是
select pincode2_.pincode as col_0_0_, paymentopt3_.Description as col_1_0_
from PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION product_ve0_
INNER JOIN product_catalog_vendor paymentid1_
ON **product_ve0_.payment_id = paymentid1_.id**
INNER JOIN PINCODES pincode2_
ON **product_ve0_.pincode_id = pincode2_.pincode_id**
INNER JOIN payement_options paymentopt3_
ON **product_ve0_.payment_options=paymentopt3_.payment_options**
where product_ve0_.id=1;
产品目录供应商类别:
@Entity
public class Product_Catalog_Vendor extends baseEntity.Entity {
@Id
@Column(name="Id")
private int id ;
//Setters and getters here
}
夹点实体:
@Entity
public class Pincodes extends baseEntity.Entity {
@Id
private int pincode_id;
@Column(name="pincode")
private int pincode;
//Setters and getters here
}
付款选项实体如下:
@Entity
@Table(name="payement_options")
public class Payment_Options extends baseEntity.Entity {
@Id
@Column(name="payment_options")
private int paymentOptions;
//Setter getter
}
我在很多网站上搜索过,但找不到幕后的原因。如果我做错了什么,请给我一些建议。请提供一些好的参考资料。谢谢为了纠正您的问题,您的查询是在paymentid1.Id而不是paymentid1.Id上联接的?还是我遗漏了预期查询和实际查询之间的差异 我不是专业人士,但我只是猜测,您的查询将连接到产品\u目录\u供应商的id:
@Id
@Column(name="Id")
private int id ;
因此,这就是为什么它是Id而不是Id…我认为由于单向映射,您根本不需要mappedBy,或者,无论如何,您以一种奇怪的方式使用它们。
mappedBy
只有在关联是双向的(不是您的案例)并且应该引用一个字段,该字段的类型与声明mappedBy的实体类型相同(而不是您案例中的字符串类型)。您使用了
mappedBy
的方式类似于referencedColumnName
属性在您的示例中:
@Entity
public class Product_Catalog_Vendor extends baseEntity.Entity {
@ManyToOne
private PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION pvpol;
}
及
公共类产品\供应商\付款\选项\位置扩展baseEntity.Entity{
@列(name=“Payment\u Id”)
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“pvpol”)
私有设置paymentId;
}
我在问题中添加了产品目录供应商类。请再提我的问题。感谢这是我的错误,我写了一个小错误生成的查询,所以我在其中编辑。我的问题是,我想加入product_ve0_u.payment_id=paymentid1_u.id,而不是product_ve0_u.id=paymentid1_u.id。hibernate在每个连接中使用我的实体类id,这是不正确的。请提供pincode、payments和product_目录entities@bellabax请在编辑的问题中查找请求的实体类。期待您的解决方案。谢谢让我知道我的建议是否为您指明了正确的方向。如果我遵循您的建议,那么我必须在数据库表(product_catalog_vendor)中创建一个名为pvpol_id的列。是吗?是的。但真正的问题是:你需要它吗?或者你可以不用mappedBy
?我想你可以不用MappedBy做同样的工作。我不想在我的表中添加新的列(产品\目录\供应商)。如何在不使用mappedBy的情况下从product\u vendor\u PAYMENT\u OPTION\u LOCATION实体引用表product\u catalog\u vendor的主键。因为Payment_Id、pincode_Id、Payment_选项是我的表中具有复合键(Id、Payment_Id、pincode_Id)的外键。在过去的一个半月里,我一直在研究hibernate,所以可能我遗漏了什么,请你帮我找到解决方案。请从一行PRODUCT\u-VENDOR\u-PAYMENT\u-OPTION\u-LOCATION
中查找表格,如果您没有将PRODUCT\u-VENDOR\u-PAYMENT\u-OPTION\u-LOCATION
id添加到PRODUCT\u-Catalog\u-VENDOR
中,您如何引用多行PRODUCT\u-Catalog\u-VENDOR\u-VENDOR
?或者我错过了什么?在PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION中使用@OneToOne
或@ManyToOne
是的,您是对的,但在我的PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION表中,我制作了复合主键(ID、PAYMENT_ID、PINCODE_ID)其中,我使用Payment_Id来引用Product_Catalog_Vendor表的主键Id,同样,我使用Product_Vendor_Payment_OPTION_LOCATION表的PINCODE_Id键来引用PINCODES表的主键PINCODE_Id,该键也是外键和主键。我想你是在问我这个?我的方向对吗?
@Entity
public class Product_Catalog_Vendor extends baseEntity.Entity {
@ManyToOne
private PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION pvpol;
}
public class PRODUCT_VENDOR_PAYMENT_OPTION_LOCATION extends baseEntity.Entity {
@Column(name="Payment_Id")
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="pvpol")
private Set<Product_Catalog_Vendor> paymentId;
}