首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JPA上连接键值表

如何在JPA上连接键值表
EN

Stack Overflow用户
提问于 2020-11-11 11:58:11
回答 1查看 110关注 0票数 0

我有现有的表附加和地址与此示例数据

表附加组件

代码语言:javascript
复制
------------------------------------------
id  |   extras_key          | extras_value
------------------------------------------
1   | name                  | John
2   | address_id            | addr-2
------------------------------------------

表地址

代码语言:javascript
复制
--------------------------------------------
addr_id     |   name            | city
--------------------------------------------
addr-2      | Office            | Jakarta
--------------------------------------------

如何在JPA上连接这些表?我的代码是

代码语言:javascript
复制
@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;

}

代码语言:javascript
复制
@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
@Table(name="extras")
public class Extras implements Serializable {
    @Id
    @Column(name="id")
    private int id;

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

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

    @OneToOne(optional = false)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "extras_value", referencedColumnName = "addr_id", insertable = false, updatable = false)
    private Address address;
}

但是,当我测试这些代码时,它的结果是假的(即使地址为空也会显示所有结果),并且在production DB (有很多数据)上花费了大量的执行时间,这是示例结果

代码语言:javascript
复制
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'}}

我尝试了这个查询,它显示了正确的结果(只显示一行地址)

代码语言:javascript
复制
SELECT * FROM extras JOIN address ON extras.extras_value = address.addr_id
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-11 13:20:10

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

代码语言:javascript
复制
@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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64780279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档