如何将 Spring @Query 与元素集合一起使用以在两个表之间进行正确的连接?
How to use Spring @Query with a Collection of elements to make the correct join between two tables?
我有以下 Java 持久性实体的结构-Table:
@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。 Tables 是自动创建的,所以我的结构有 3 个 tables:
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))
"intermediate" table 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 存储库上进行查询以搜索所有产品及其价格类型 = 'euro'。
我想使用 Spring @Query,像这样:
@Query("select p from Product p where p.prices.type = 'euro'")
如何才能正确加入?我的示例查询生成一个 Hibernate 异常。
谢谢。
您只需在查询中添加一个连接子句即可。
@Query("SELECT p FROM Product p JOIN p.prices pr WHERE pr.type = 'euro'")
但是由于您已经在使用 Spring 数据,所以我只建议使用查询方法而不是为这种简单的情况编写自定义语句。
试试这个,没有 @Query 注释
我的代码
List<User> findAllByAuthorities(Authority authority);
对于您,您传递类型为 'euro'
的 Price 对象
List<Product> findProductsByPrices(Price price);
我有以下 Java 持久性实体的结构-Table:
@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。 Tables 是自动创建的,所以我的结构有 3 个 tables:
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))
"intermediate" table 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 存储库上进行查询以搜索所有产品及其价格类型 = 'euro'。
我想使用 Spring @Query,像这样:
@Query("select p from Product p where p.prices.type = 'euro'")
如何才能正确加入?我的示例查询生成一个 Hibernate 异常。
谢谢。
您只需在查询中添加一个连接子句即可。
@Query("SELECT p FROM Product p JOIN p.prices pr WHERE pr.type = 'euro'")
但是由于您已经在使用 Spring 数据,所以我只建议使用查询方法而不是为这种简单的情况编写自定义语句。
试试这个,没有 @Query 注释
我的代码
List<User> findAllByAuthorities(Authority authority);
对于您,您传递类型为 'euro'
的 Price 对象List<Product> findProductsByPrices(Price price);