如何使用Spring @Query和一个元素集合来在两个表之间进行正确的连接?

时间:2016-04-28 07:59:09

标签: spring hibernate jpa hql spring-data-jpa

我有一个Java持久性实体表的结构:

@Entity
@Table
public class Product {

    @Id
    private String id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Price> prices;

    // getters and setters
}


@Entity
@Table
public class Price {

    @Id
    private String id;

    @Column
    private Float value;

    @Column
    private Strung type;

    // getters and setters
}

数据库是HQL。表已经自动创建,因此我有3个表的结构:

CREATE MEMORY TABLE PRODUCT (ID VARCHAR(255) NOT NULL PRIMARY KEY, NAME VARCHAR(255))   
CREATE MEMORY TABLE PRICE (ID VARCHAR(255) NOT NULL PRIMARY KEY, VALUE DOUBLE, TYPE VARCHAR(255))
CREATE MEMORY TABLE PRODUCT_PRICE (PRODUCT_ID VARCHAR(255) NOT NULL, PRICES_ID VARCHAR(255) NOT NULL, CONSTRAINT FK_SJ093JT9KRVI6PN4LQBDO30FU FOREIGN KEY(PRICES_ID) REFERENCES PRICE(ID),CONSTRAINT FK_H70YJF4SF4ABLK7MSXXV648Q9 FOREIGN KEY(PRODUCT_ID) REFERENCES PRODUCT(ID),CONSTRAINT UK_QJ093JT9KRVI4PN2LQBDO30FU UNIQUE(PRICES_ID))

“中间”表格PRODUCT_PRICE仅包含2个字段(用于在PRODUCT和PRICE之间进行连接的ID)。

这里有一些示例数据:

INSERT INTO PRODUCT ('PRD001','Product 1');
INSERT INTO PRICE ('PRC001', 1000, 'euro');
INSERT INTO PRICE ('PRC002', 50, 'tax');
INSERT INTO PRODUCT_PRICE ('PRD001','PRC001');
INSERT INTO PRODUCT_PRICE ('PRD001','PRC002');

我必须对JPA Repository进行查询,以搜索所有产品及其价格类型='euro'。

我想使用Spring @Query,例如:

@Query("select p from Product p where p.prices.type = 'euro'")

如何正确加入?我的示例查询生成一个Hibernate Exception。

感谢。

2 个答案:

答案 0 :(得分:1)

您只需在查询中添加join子句即可。

@Query("SELECT p FROM Product p JOIN p.prices pr WHERE pr.type = 'euro'")

但是,由于您已经在使用Spring Data,我建议使用查询方法,而不是为这种简单的情况编写自定义语句。

答案 1 :(得分:0)

尝试这个,没有@Query注释

我的代码

 List<User> findAllByAuthorities(Authority authority);

对于你,你传递Price对象,其中type为'euro'

List<Product> findProductsByPrices(Price price);