Spring 如何使用queryDsl谓词从列中获取唯一值

Spring 如何使用queryDsl谓词从列中获取唯一值,spring,predicate,spring-data-jpa,querydsl,Spring,Predicate,Spring Data Jpa,Querydsl,我试图从表“employee_register”中的列(如“Assignment”)中获取唯一值。我不知道如何使用查询Dsl谓词实现这一点。有人能帮我做这个吗我在浏览这个链接时发现了这个 一位名叫raghu的观众提出了一个类似的问题,下面是作者对这个问题的回答。这个问题可能对其他人有帮助吗 作者的答复 您有两个选项来实现此功能: 使用@NamedQuery或@query注释创建查询时,请使用JPQL的DISTINCT关键字。 在规范生成器方法中调用CriteriaQuery类的disctinct

我试图从表“employee_register”中的列(如“Assignment”)中获取唯一值。我不知道如何使用查询Dsl谓词实现这一点。有人能帮我做这个吗

我在浏览这个链接时发现了这个 一位名叫raghu的观众提出了一个类似的问题,下面是作者对这个问题的回答。这个问题可能对其他人有帮助吗

作者的答复 您有两个选项来实现此功能:

使用@NamedQuery或@query注释创建查询时,请使用JPQL的DISTINCT关键字。 在规范生成器方法中调用CriteriaQuery类的disctinct()方法(规范接口的toPredicate()方法获取CriteriaQuery对象的引用作为参数)

JPQL示例: 从人员p中选择不同的p,其中

规范生成器的API标准:
公共类人员规范{
公共静态规范lastNameIsLike(最终字符串搜索术语){
返回新规范(){
@凌驾
公共谓词toPredicate(Root personRoot,CriteriaQuery<?>query,CriteriaBuilder cb){
query.distinct(true);
//构建谓词
}
};
}
}
在您的情况下,我将向CustomerRepository接口(或您的存储库接口)添加以下方法:

@Query(“从客户c中选择不同的c.lastName”)
公共列表findLastNames();
您可以对查询对象调用distinct()。例如(JPA+QueryDSL):

@测试
@交易的
public void testQueryDSLDistinct()引发异常{
调试(“TestQueryDSL已启动”);
JPAQueryFactory queryFactory=新的JPAQueryFactory(entityManager);
QEmployeeRegister er=QEmployeeRegister.employeeregister;
列表元组=queryFactory.select(
Projections.bean(EmployeeRegister.class,er.designation)).distinct()
.from(er).limit(10).fetch();
for(EmployeeRegister记录:元组){
System.out.println(record.getDesignation());
}
}

您只是想从表中选择distinct?您能否为要执行的查询提供sql?请从employee_register中选择count(不同的名称)
public class PersonSpecifications {
public static Specification lastNameIsLike(final String searchTerm) {

return new Specification () {
@Override
public Predicate toPredicate(Root personRoot, CriteriaQuery< ?> query,CriteriaBuilder cb) {
query.distinct(true);
//Build Predicate
}
};
}
}
@Query("SELECT DISTINCT c.lastName FROM Customer c")
public List<String> findLastNames();
@Test
@Transactional
public void testQueryDSLDistinct() throws Exception {
    log.debug("testQueryDSLDistinct started");
    JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
    QEmployeeRegister er = QEmployeeRegister.employeeregister;
    List<EmployeeRegister> tuples = queryFactory.select(
            Projections.bean(EmployeeRegister.class, er.designation)).distinct()
            .from(er).limit(10).fetch();
    for (EmployeeRegister record: tuples) {
        System.out.println(record.getDesignation());
    }
}