我正在尝试使用JPA创建规范,但出现此错误。该数据库是postgres。
这是我要实现的SQL函数
SELECT * FROM Document WHERE datasheet-id in (SELECT datasheet-id FROM datasheet_domain WHERE id_domain in (List<Long>);
这是创建规范的功能
private static final String DATA_SHEET = "dataSheet";
public static Specification<Document> documentHasDomains(final List<Long> domains){
return (Specification<Document>) (root, query, criteriaBuilder) -> {
Subquery<Integer> datasheetIds = query.subquery(Integer.class);
Root<DataSheetDomain> rootDataSheetDomain = datasheetIds.from(DataSheetDomain.class);
datasheetIds.select(rootDataSheetDomain.get(DATA_SHEET)).
where(rootDataSheetDomain.get("domain")).in(domains);
return criteriaBuilder.in(root.get(DATA_SHEET)).value(datasheetIds);
};
}
这里有与该查询有关的实体。
实体DataSheetDomain
@Table(name = "DATA_SHEET_DOMAIN")
public class DataSheetDomain implements Cloneable{
@Id
@Column(name="IDDATASHEETDOMAIN")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "data_sheet_domain_id_sequence")
@SequenceGenerator(name = "data_sheet_domain_id_sequence", sequenceName = "data_sheet_domain_id_sequence", allocationSize = 1)
private Long id;
@ManyToOne
@JoinColumn(name = "IDDATASHEET")
@NotNull
private DataSheet dataSheet;
@ManyToOne
@JoinColumn(name = "IDDOMAIN")
@NotNull
private Domain domain;
@Column(name = "PREFERENCEORDER")
@NotNull
private Integer preferenceOrder;
public DataSheetDomain clone() throws CloneNotSupportedException {
DataSheetDomain dataSheetDomain = (DataSheetDomain) super.clone();
dataSheetDomain.setId(null);
return dataSheetDomain;
}
}
域类
@Table(name = "DOMAIN")
public class Domain {
@Id
@Column(name="IDDOMAIN")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "domain_id_sequence")
@SequenceGenerator(name = "domain_id_sequence", sequenceName = "domain_id_sequence", allocationSize=1)
private Long id;
@Column(name="CODE", length = 10)
@NotNull
private String code;
@Column(name="LABEL", length = 255)
@NotNull
private String label;
@Column(name="DESCRIPTION", length = 1000)
private String description;
@OneToMany(mappedBy = "domain", fetch = FetchType.LAZY)
private List<DomainWorkspace> domainWorkspaceList;
}
谢谢你们的回答,谢谢您抽出宝贵的时间来做。