首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA 2标准查询投影

问JPA 2标准查询投影
EN

Stack Overflow用户
提问于 2017-04-21 18:48:44
回答 2查看 2.9K关注 0票数 1

使用JPA2条件查询,我们可以在DTO (例如)上投影最终结果,如下所示:

代码语言:javascript
复制
query.select(builder.construct( ProductGridDTO.class,
        root.get(Productos_.proId),
        root.get(Productos_.proAlias),
        root.get(Productos_.proNombre),
        companies.get(Companias_.ciaNombre),
        companies.get(Companias_.ciaId)));

但是,这个方法依赖于我的DTO类中的参数顺序,这是完全错误的。使用旧的hibernate标准API (现在不再推荐),我们可以使用投影列表:

ProjectionList projectionList = Projections.projectionList();

代码语言:javascript
复制
    projectionList.add(Projections.property("id"), "id");
    projectionList.add(Projections.property("name"), "name");

它不依赖于DTO的参数顺序。

是否有可能在JPA中使用类似的策略?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-26 08:48:10

我转到了QueryDSL,它提供了更高级别的抽象,并解决了这个投影问题。因此,加载实体并为所述实体返回DTO的查询如下:

代码语言:javascript
复制
public List<CompanyDTO> findByCompanyId(String companyId) {
    JPAQuery<?> query = new JPAQuery<Void>(em);

    QCompany company = QCompany.company;

    return query.from(company)
            .where(company.companyId.eq(companyId))
            .select(Projections.constructor(CompanyDTO.class, company))
            .fetch();
}

其中CompanyDTO包含公司实体的构造函数。

票数 0
EN

Stack Overflow用户

发布于 2017-04-21 20:52:14

我不这么认为,在JPA中,论证顺序必须匹配。这可能是因为,在Java 8之前,只有在字节码包含调试信息的情况下才能使用参数名称。我的猜测是,大多数JPA提供程序最终都调用了Constructor.newInstance(),在这里,必须正确地排序参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43549969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档