Java 如何连接JPA上的键值表

Java 如何连接JPA上的键值表,java,hibernate,jpa,join,mapping,Java,Hibernate,Jpa,Join,Mapping,我有这个示例数据的现有表extras&address 额外服务 ------------------------------------------ id | extras_key | extras_value ------------------------------------------ 1 | name | John 2 | address_id | addr-2 -----------------

我有这个示例数据的现有表extras&address

额外服务

------------------------------------------
id  |   extras_key          | extras_value
------------------------------------------
1   | name                  | John
2   | address_id            | addr-2
------------------------------------------
表地址

--------------------------------------------
addr_id     |   name            | city
--------------------------------------------
addr-2      | Office            | Jakarta
--------------------------------------------
如何连接JPA上的表?我的代码是

@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
@Table(name="address")
public class Address implements Serializable {
    @Id
    @Column(name="addr_id")
    private String addrId;

    @Column(name="name")
    private String name;

    @Column(name="city")
    private String city;

}

但是当我测试这些代码时,它有一个错误的结果(即使使用空地址也显示所有结果),并且在生产数据库上花费了大量的执行时间(其中包含大量数据),这就是示例结果

Extras{id=1, extrasKey='name', extrasValue='John', address=null}
Extras{id=2, extrasKey='address_id', extrasValue='addr-2', address=Address{addrId='addr-2', name='Office', city='Jakarta'}}
我尝试了这个查询,它显示了正确的结果(只显示一行地址)


您可以在存储库中添加查询:

@Repository
public interface ExtrasRepository extends CrudRepository<Extras, Integer> {

    @Query(value = "select extras.* from extras " +
            "inner join address on extras.extras_value = address.addr_id",nativeQuery = true)
    List<Extras> functionName();
}
@存储库
公共接口ExtrasRepository扩展了Crudepository{
@查询(value=“从附加中选择附加。*”+
“extras.extras_值=address.addr_id上的内部联接地址”,nativeQuery=true)
列出函数名();
}

谢谢!但当我在“学生”表中再添加一个表(比如表“student”)并在“student”表中添加列“student\u id”和“name”,在“extras”表中再添加一个字段“student\u id”时,我在“student”实体中的变量“extras”上得到了空值。我在student repository@query(value=“select*from student.id=extras.student\u id”+“JOIN address.addr\u id=extras.extras\u value”上的加入地址,nativeQuery=true)中使用了这个本机查询,当我执行sql查询时,我得到了正确的结果。学生(id=1,name=john,extras=null)是否指定了extras实体和学生之间的关系?是的,在学生实体中,它有@OneToOne@NotFound(action=NotFoundAction.IGNORE)@JoinColumn(name=“id”,referencedColumnName=“Student\u id”)extras;
SELECT * FROM extras JOIN address ON extras.extras_value = address.addr_id
@Repository
public interface ExtrasRepository extends CrudRepository<Extras, Integer> {

    @Query(value = "select extras.* from extras " +
            "inner join address on extras.extras_value = address.addr_id",nativeQuery = true)
    List<Extras> functionName();
}