Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用存储库中的@Query进行JPA连接查询_Java_Hibernate_Jpa - Fatal编程技术网

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倍。有什么建议吗?