Java Hibernate是否从连接到错误列的命名查询生成查询?

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"

我正在使用命名查询(Hibernate4)

    @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;
}