用JPA加入两个表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JPA加入两个表相关的知识,希望对你有一定的参考价值。
我正在尝试使用@NamedQuery
加入两张桌子,Address
和Division
。同一地址有多个部门。目前我有
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_id
和division_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;
}
自从@NamedQuery
和d
出现以来,a
发生了变化,结果列表返回了Object[]
列表。这是Division
和Address
的对象。这就是为什么d
被保留并且a
从@NamedQuery
被移除的原因。
我认为问题是你在提到地址类中的@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
对我有用的是将@OneToMany
和@ManyToOne
改为在@OneToOne
桌上用@PrimaryKeyJoinColumn
作为address
。代码更新如下:Division.java更改为:
@OneToOne(mappedBy="divisionMailingAddress")
private Address address;
Address.java改为:
@OneToOne
@PrimaryKeyJoinColumn
private Division divisionMailingAddress;
以上是关于用JPA加入两个表的主要内容,如果未能解决你的问题,请参考以下文章
当我使用两个表实体时如何在 JPA @JoinColumn 中指定忽略大小写