用JPA加入两个表

问题描述 投票:0回答:2

我正在尝试使用@NamedQuery加入两张桌子,AddressDivision。同一地址有多个部门。目前我有 Division.java:

@Entity
@Table(name="division")
@NamedQuery(name="Division.mailingAddress", query="SELECT d, a from Division d LEFT JOIN d.addresses a")
public class Division implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name="division_id")
    private Short divisionId;

    @Basic(optional = false)
    @Column(name="division_name")
    private String divisionName;

    @Basic(optional = false)
    @Column(name="address_id")
    private Short addressId;

    @OneToMany(mappedBy="divisionMailingAddress")
    private List<Address> addresses;

    //getters and setters
}

addresses.Java:

@Entity
@Table(name="address")
public class Address implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GeneratedType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "address_id")
    private Short addressID;

    @Basic(optional = false)
    @Column(name = "mailing_address")
    private String mailingAddress;

    @ManyToOne
    private Division divisionMailingAddress;
}

我运行时得到的错误是:Unknown column 't0.DIVISIONMAILINGADDRESS_division_id' in 'on clause'

我想要的是这条线在MySQL中有效:SELECT * FROM (division d join address a on d.address_id = a.address_id); 目前,JPA正在将命名查询解析为: SELECT t1."all columns", t0."all columns" from division t1 LEFT OUTER JOIN address t0 ON (t0.DIVISIONMAILINGADDRESS_division_id = t1.division_id)我在做什么有什么问题? JPA是否希望加入来自地址与部门?我怎么接到address_iddivision_id的电话?

更新:

在这里有很大的帮助,这两个课程已被改变,以实现我想要的结果。

division.Java:

@Entity
@Table(name="division")
@NamedQuery(name="Division.mailingAddress", query="SELECT d from Division d LEFT JOIN d.addressesM2O a")
public class Division implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name="division_id")
    private Short divisionId;

    @Basic(optional = false)
    @Column(name="division_name")
    private String divisionName;

    @Basic(optional = false)
    @Column(name="address_id")
    private Short addressId;

    @ManyToOne(targetEntity = Address.java)
    @JoinColumn(name = "address_id", updatable=false, insertable=false)
    private Address addressesM2O;

    //getters and setters
}

address.Java:

@Entity
@Table(name="address")
public class Address implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GeneratedType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "address_id")
    private Short addressID;

    @Basic(optional = false)
    @Column(name = "mailing_address")
    private String mailingAddress;

    @OneToMany(mappedBy="addressesM2O")
    private List<Division> divisionO2M;
}

自从@NamedQueryd出现以来,a发生了变化,结果列表返回了Object[]列表。这是DivisionAddress的对象。这就是为什么d被保留并且a@NamedQuery被移除的原因。

jpa netbeans eclipselink named-query
2个回答
1
投票

我认为问题是你在提到地址类中的@JoinColumn时并未提及@ManyToOne,因此在进行连接时JPA本身正在创建外键DIVISIONMAILINGADDRESS_division_id。

尝试在Address类中提及ManyToOne关系如下,如果出现任何问题,请告诉我:

@ManyToOne(targetEntity = Division.class)
@JoinColumn(name= "division_id")//basically the name of the column here should be same as the one mentioned in your database

0
投票

对我有用的是将@OneToMany@ManyToOne改为在@OneToOne桌上用@PrimaryKeyJoinColumn作为address。代码更新如下:Division.java更改为:

@OneToOne(mappedBy="divisionMailingAddress")
private Address address;

Address.java改为:

@OneToOne
@PrimaryKeyJoinColumn
private Division divisionMailingAddress;
© www.soinside.com 2019 - 2024. All rights reserved.