选择特定列的 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 规范的主要内容,如果未能解决你的问题,请参考以下文章
处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型
Spring-Data-JPA ManyToMany 与额外列的关系