我使用jhipster标准和jpa规范来实现进行研究的endpoint。
嗯,这是工作,但继续给我发送副本。
这个模型有一些前提条件
public class Prestation extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@NotNull
@Column(name = "jhi_label", nullable = false)
private String label;
@Column(name = "description")
private String description;
@Column(name = "unit")
private String unit;
@NotNull
@Column(name = "activated", nullable = false)
private boolean activated;
@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties("prestations")
private SubCategory subCategory;
@OneToMany(mappedBy = "prestation", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CompanyPrestation> companies = new ArrayList<>();
公司与前置站的关系
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private List<CompanyPrestation> prestations = new ArrayList<>();
这是我用来创建规范的CompanySpecification类,我把它交给了存储库
public class CompanySpecification extends QueryService<Company> implements Specification<Company> {
private static final long serialVersionUID = 1L;
private CompanyCriteria criteria;
public CompanySpecification(CompanyCriteria criteria) {
this.criteria = criteria;
}
@Override
public Predicate toPredicate(Root<Company> roots, CriteriaQuery<?> query, CriteriaBuilder builder) {
Specification<Company> specification = Specification.where(null);
if (criteria != null) {
if (criteria.getName() != null) {
specification = specification.or(buildStringSpecification(criteria.getName(), Company_.name));
}
if (criteria.getSiret() != null) {
specification = specification.or(buildStringSpecification(criteria.getSiret(), Company_.siret));
}
if (criteria.getCodeAPE() != null) {
specification = specification.or(buildStringSpecification(criteria.getCodeAPE(), Company_.codeAPE));
}
if (criteria.getLegalForm() != null) {
specification = specification.or(buildStringSpecification(criteria.getLegalForm(), Company_.legalForm));
}
if (criteria.getVille() != null) {
specification = specification
.and(buildReferringEntitySpecification(criteria.getVille(), Company_.address, Address_.ville));
}
if (criteria.getExercicePlace() != null && !criteria.getExercicePlace().getIn().isEmpty()) {
Filter<ExercicePlace> exercicePlaceFilter = new Filter<>();
exercicePlaceFilter.setIn(criteria.getExercicePlace().getIn().stream().map(ExercicePlace::valueOf)
.collect(Collectors.toList()));
specification = specification.and(buildSpecification(exercicePlaceFilter, Company_.exercicePlace));
}
if (criteria.getCodePostal() != null) {
specification = specification.and(buildReferringEntitySpecification(criteria.getCodePostal(),
Company_.address, Address_.codePostal));
}
if (criteria.getPrestationsId() != null) {
specification = specification.and(buildSpecification(criteria.getPrestationsId(),
root -> root.join(Company_.prestations, JoinType.LEFT)
.join(CompanyPrestation_.prestation, JoinType.LEFT).get(Prestation_.id)));
}
if (criteria.getCatId() != null) {
specification = specification.and(buildSpecification(criteria.getCatId(),
root -> root.join(Company_.prestations, JoinType.LEFT)
.join(CompanyPrestation_.prestation, JoinType.LEFT)
.join(Prestation_.subCategory, JoinType.LEFT).join(SubCategory_.category, JoinType.LEFT)
.get(Category_.id)));
}
if (criteria.getSubCatId() != null) {
specification = specification.and(buildSpecification(criteria.getSubCatId(),
root -> root.join(Company_.prestations, JoinType.LEFT)
.join(CompanyPrestation_.prestation, JoinType.LEFT)
.join(Prestation_.subCategory, JoinType.LEFT).get(SubCategory_.id)));
}
if (criteria.getPrestationName() != null) {
specification = specification.or(buildSpecification(criteria.getPrestationName(),
root -> root.join(Company_.prestations, JoinType.LEFT)
.join(CompanyPrestation_.prestation, JoinType.LEFT).get(Prestation_.label)));
}
if (criteria.getPriceMinimum() != null || criteria.getPriceMaximum() != null) {
specification = specification.and((lroot, lquery, lcriteriaBuilder) -> {
ListJoin<Company, CompanyPrestation> joinCompnayToCompanyPrestations = lroot
.join(Company_.prestations, JoinType.LEFT);
if (criteria.getPriceMinimum() != null && criteria.getPriceMaximum() != null) {
return lcriteriaBuilder.between(
joinCompnayToCompanyPrestations.get(CompanyPrestation_.pricePerUnit),
criteria.getPriceMinimum().getGreaterOrEqualThan(),
criteria.getPriceMaximum().getLessOrEqualThan()
);
} else if (criteria.getPriceMinimum() != null) {
return lcriteriaBuilder.greaterThanOrEqualTo(
joinCompnayToCompanyPrestations.get(CompanyPrestation_.pricePerUnit),
criteria.getPriceMinimum().getGreaterOrEqualThan());
} else {
return lcriteriaBuilder.lessThanOrEqualTo(
joinCompnayToCompanyPrestations.get(CompanyPrestation_.pricePerUnit),
criteria.getPriceMaximum().getLessOrEqualThan());
}
});
}
}
return specification.toPredicate(roots, query, builder);
}
这是我使用它的服务方法
@Transactional(readOnly = true)
public Page<CompanyDTO> findByCriteria(CompanyCriteria criteria, Pageable page) {
log.debug("find by criteria : {}, page: {}", criteria, page);
Specification<Company> spec = Specification.where(null);
CompanySpecification specification = new CompanySpecification(criteria);
spec = (Specification<Company>) specification;
Page<Company> vitrinesPage = companyRepository.findAll(spec, page);
List<CompanyDTO> list = companyMapper.toDto(vitrinesPage.getContent());
Page<CompanyDTO> listPage = new PageImpl<>(list, page, vitrinesPage.getTotalElements());
return listPage;
}
我在CriteriaQuery中发现了一个不同的方法,但我真的不知道如何在我的规范中添加它。
请帮帮忙!
在您的toPredicate
方法内部,您可以做;
@Override
public Predicate toPredicate(Root<Company> roots, CriteriaQuery<?> query, CriteriaBuilder builder) {
....
query.distinct(true);
return ...;
}
从
虽然你想做的可能不可能,但据说这是JPA的一个限制
您可以尝试做的是在获取后删除代码中的重复项,或者尝试覆盖等于
我正在使用一个JPA查询,它使用一个规范来检索实体。当我执行查询时,我得到了一个错误: 组织。springframework。数据映射。PropertyReferenceException:找不到类型任务的属性名称! 我已经查看了之前在该网站上提出的类似问题的答案 当我使用调试器逐步检查代码时,条件生成器中的扩展路径将返回嵌入的ID类,但当规范实际用于查询时,该属性似乎正在应用于基本实体类。 我是
我使用的是Spring Data JPA 1.7.1 这里有一个例子:
有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室:
我使用spring jpa规范动态构建实体查询。 它工作完美,但是查询返回所有实体字段,这使得性能变慢。我只想获取特定的实体字段,而不是获取我不想要也不会使用的所有实体字段和依赖项。 我在网上搜索,尝试了一些场景,但没有任何不足。有人能就此提出任何解决方案吗? 提前感谢 这是我的。我正在使用spring boot 2.2.4 规格: 存储库: 音乐会服务: ConcertServiceImpl:
我使用Spring Boot,对于我来说,不清楚如何根据嵌套对象的属性对其进行排序,这些嵌套对象具有和,因为: 原因:org。postgresql。util。PSQLException:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中 Spring Data JPA生成了错误的查询。 让我们看一个小例子: 我们有类和嵌套对象和。 类还包含。 现在,我想用
我有下面的查询,其中两个表连接在非主列上。该表连接到一个公用列上。 用户详细信息 如何在JPA规范中实现相同的查询