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

时间:2014-02-07 07:32:46

标签: spring predicate spring-data-jpa querydsl

我正试图从列“employee_register”中的一个专栏中获取一个唯一的值。我不知道如何使用查询Dsl谓词来实现这一点。任何人都可以帮助我

2 个答案:

答案 0 :(得分:2)

我在浏览此链接时发现了这一点 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示例:

SELECT DISTINCT p FROM Person p WHERE ...

使用规范构建器的Criteria API:

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接口(或您的存储库接口):

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

答案 1 :(得分:0)

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

@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());
    }
}