让我们想象以下实体:
@Inheritance(JOINED)
@Entity
abstract class AbstractCompany {
@Id
private Long id;
private String name;
//...
}
@Entity
class Company extends AbstractCompany {
private String city;
//...
}
@Entity Invitation extends AbstractCompany {
private boolean expired;
//...
}
问题是:如何使用 Spring Data Jpa
Specification
查询来自伦敦的公司或未过期邀请的所有 AbstractCompanies(仅使用一个查询:我想要一致的分页和“按名称”排序)?
由于我们涉及继承,我必须使用
jakarta.persistence.criteria.CriteriaBuilder#treat
但这意味着内部联接并仅选择一种类型。
我看到您正在使用 @Inheritance(JOINED) 注释,因此子类获得了超类的主键外键列。
我将向您推荐 Spring Data JPA 的解决方案。在实现上,我没有看到任何问题,所以我可以帮助您实现@Repository接口。
@Repository
public interface AbstractCompanyRepository extends JpaRepository<AbstractCompany, Long> {
@Query("SELECT DISTINCT a FROM AbstractCompany a " +
"JOIN Company c ON c.id = a.id " +
"JOIN Invitation i ON i.id = a.id " +
"WHERE c.city = 'London' " +
"AND NOT i.expired")
List<AbstractCompany> getLondonAndNotExpired();
}