Java 使用存储库中的@Query进行JPA连接查询
我有两个具有复合主键的表,它也有外键关系。我正在尝试这些表之间的Java 使用存储库中的@Query进行JPA连接查询,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个具有复合主键的表,它也有外键关系。我正在尝试这些表之间的JPA映射。我们需要从JPA存储库获得下面的连接查询结果 select * from A i inner join B n on i.id = n.id where i.id = 'XXX' and i.version=99999; 表格:A字段为 id、名称、版本是主键 表格:B字段为 id、名称、版本、类型是主键id、名称、版本是外键 @Table(name = "A") @IdClass(APK.class) public
JPA
映射。我们需要从JPA存储库获得下面的连接查询结果
select * from A i inner join B n on i.id = n.id where i.id = 'XXX' and i.version=99999;
表格:A字段为
id、名称、版本是主键
表格:B字段为
id、名称、版本、类型是主键id、名称、版本是外键
@Table(name = "A")
@IdClass(APK.class)
public class A {
@Id
@Column(name = "ID")
private String id;
@Id
@Column(name = "NAME")
private String name;
@Id
@Column(name = "Version")
private String version;
//getter setter, toString, equals and hash code
@OneToOne @JoinColumn(name="ID")
private B b;
getter setter
}
public class APK implements Serializable {
private String id;
private Long version;
private String name;
//getter setter, toString, equals and hash code
}
@Table(name = "B")
@IdClass(BPK.class)
public class B {
@Id
@Column(name = "ID")
private String id;
@Id
@Column(name = "NAME")
private String name;
@Id
@Column(name = "Version")
private String version;
@Id
@Column(name = "TYPE")
private Type type;
// getter setter, toString, equals and hash code
@OneToOne @MapsId("ID")
private A a;
//getter setter
}
public class APK implements Serializable {
private String id;
private Long version;
private String name;
private Type type;
//getter setter, toString, equals and hash code
}
使用此代码获取以下错误:
原因:org.hibernate.AnnotationException:外键引用
com.domain.data.A中的com.domain.data.B的
专栏。应该是5岁
请在这方面提供帮助。此问题通过使用以下映射解决
@Table(name = "A")
@IdClass(APK.class)
public class A {
@OneToMany(fetch=FetchType.LAZY, mappedBy="a")
private List<B> b;
//getter and setter for b
}
@Table(name = "B")
@IdClass(BPK.class)
public class B {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "id", insertable = false, updatable = false),
@JoinColumn(name = "name", insertable = false, updatable = false),
@JoinColumn(name = "version", insertable = false, updatable = false)
})
private A a;
//getter and setter for a
}
@Table(name=“A”)
@IdClass(APK.class)
公共A类{
@OneToMany(fetch=FetchType.LAZY,mappedBy=“a”)
私人名单b;
//b的接受者和接受者
}
@表(name=“B”)
@IdClass(BPK.class)
公共B级{
@manytone(fetch=FetchType.LAZY)
@连接柱({
@JoinColumn(name=“id”,insertable=false,updateable=false),
@JoinColumn(name=“name”,insertable=false,updateable=false),
@JoinColumn(name=“version”,insertable=false,updateable=false)
})
私人A;
//一场比赛的接球手和接球手
}
JPQL查询是“select i from B i internal JOIN i.a n WHERE n.id=:id”如果您只需要知道a的
id
就可以快速识别B引用的a,那么为什么名称和版本是实体id的一部分?当您可以使用单个字段作为ID时,为什么要使用如此糟糕的组合键?我得到的查询值为空。如果我将结果作为一个列表传递,它应该显示7行记录,但它给出的值是null的7倍。有什么建议吗?