选择特定列的 Spring Data JPA 规范

Posted

技术标签:

【中文标题】选择特定列的 Spring Data JPA 规范【英文标题】:Spring Data JPA Specification to Select Specific Columns 【发布时间】:2014-03-04 12:19:51 【问题描述】:

我们可以通过在我们的存储库接口中编写自定义 @Query 方法来选择特定的列。但是,我不想为不同的属性写这么多方法。

我试过这个,但它总是返回整个对象。

public class MySpecifications 

    public static Specification<MyInfo> propertiesWithId(final String[] properties, final Object id, final String idProperty)
    

        return new Specification<MyInfo>() 

            @Override
            public Predicate toPredicate(Root<MyInfo> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) 

                query = cb.createTupleQuery(); //tried cb.createQuery(MyInfo.class); as well

                List<Selection<? extends Object>> selectionList = new ArrayList<Selection<? extends Object>>();

                for (String property : properties) 

                    Selection<? extends Object> selection = root.get(property);

                    selectionList.add(selection);
                

                return query.multiselect(selectionList).where(cb.equal(root.get(idProperty), id)).getRestriction();
            

        ;
    

用作:

MyInfo findOne(Specification(properties,idValue, idProperty));

这是正确的方法吗?哪里错了?

【问题讨论】:

您考虑过使用投影吗? baeldung.com/spring-data-jpa-projections 【参考方案1】:

当前的 spring data jpa 规范执行器仅限于 where 子句中的条件,因此您不能更改选定的列,它隐含地仅限于完整实体(查看 @987654322 @接口文档)。您必须使用自定义存储库实现,或者转移到命名查询-

Spring Data JPA and Querydsl to fetch subset of columns using bean/constructor projection

【讨论】:

【参考方案2】:

我试过这个,但它总是返回整个对象。

此方法返回匹配给定规范的单个实体。请查看here

据我了解,这是正确的方法。 U 可以正常访问实体的属性(例如 MyInfo.getIdProperty())

【讨论】:

【参考方案3】:

规范是对 where 子句的抽象。由于 JPA 标准 API 的设计,您可以在规范中处理各种内容,但除了声明 where 子句之外的任何副作用的行为都是未定义的。

如果您想控制选择列表,您可以使用带有投影的查询派生和非常有限的查询支持,或者在自定义方法中构建完整的自定义查询。

【讨论】:

以上是关于选择特定列的 Spring Data JPA 规范的主要内容,如果未能解决你的问题,请参考以下文章

带有额外列的 Spring Data JPA 多对多

处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型

Spring-Data-JPA ManyToMany 与额外列的关系

Spring Data JPA 有没有办法使用方法名称解析来计算实体?

Spring Data JPA:创建规范查询获取连接

干货|一文读懂 Spring Data Jpa!