关于spring:如何使用queryDsl谓词从列中获取唯一值

how to get unique values from a column using queryDsl predicate

我试图从表" employee_register"的列" designation"中获取唯一值。 我不知道如何使用查询Dsl谓词来实现这一点。 谁能帮我这个


您可以在Query对象上调用distinct()。例如(JPA + QueryDSL):

1
2
3
4
5
6
7
8
9
10
11
12
13
@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());
    }
}

我在通过此链接时找到了
http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-four-jpa-criteria-queries。一个名为raghu的观众提出了类似的问题,下面是作者的回答。这个问题可能对其他人有帮助

作者的答案

您可以通过以下两种方法实现此目的:

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

JPQL示例:

选择个人p从p所在的地方...

具有规范构建器的标准API:

1
2
3
4
5
6
7
8
9
10
11
12
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
}
};
}
}

对于您的情况,我会将以下方法添加到CustomerRepository接口(或您的存储库接口是什么):

1
2
@Query("SELECT DISTINCT c.lastName FROM Customer c")
public List<String> findLastNames();