用于返回特定字段的Spring数据JPA

时间:2015-05-22 12:59:39

标签: spring jpa spring-data-jpa

Spring Data是否有返回特定字段的机制?

我熟悉语法:

Invoice findByCode(String code);

这个怎么样:

Integer findIdByCode(String code);

仅返回id字段。或

Tuple findIdAndNameByCode(String code);

返回一个元组。或

Invoice findIdAndNameByCode(String code);

返回仅填充特定字段的实体。可以使用构造函数仅在定义时使用那些字段 - 否则构造为空并填充字段。

修改

为了获得更多资格,我了解@Query,构造函数表达式以及@NamedEntityGraph等解决方案。我的问题很简单 - Spring数据是否支持如我所暗示的那样的简写语法?

如果没有,也许对于以后的版本来说这是一个很酷的增强...

我不是在寻找解决方法。

3 个答案:

答案 0 :(得分:3)

您可以使用JPQL Constructor Expressions

SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price)
    FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00

构造函数名称必须是完全限定的

答案 1 :(得分:1)

如果你想从表中返回1个字段并且它是原始的(或自动装箱),你可以使用下一个:

@Query("select distinct t.locationId from Table t")
List<Long> findAllWashroomLocationId();

其中:

  • - 代表您的表的类名称
  • t - 别名
  • locationId - 字段名称(在Table对象中)
  • - locationId类型(整数,字符串,...)

答案 2 :(得分:1)

不确定您尝试实现的内容是否与在同一JPA生成的查询中使用多个投影相同(其中方法名称相同)。我在这篇文章中发了一个答案。

https://stackoverflow.com/a/43373337/4540216

  

所以我设法弄清楚如何使用多个投影   单一查询。

<T> T getByUsername(String username, Class<T> projection) This allows the method caller to specified the type of projection to be
     

应用于查询。

     

为了进一步改善这一点,它不容易出错,我做了一个空白   投影必须扩展的界面才能够   将类插入参数。

public interface JPAProjection {
}

public interface UserRepository extends CrudRepository<UserAccount, Long> {
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection);
}
     
    

投影界面

  
public interface UserDetailsProjection extends JPAProjection{
    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.firstname}")
    String getFirstname();

    @Value("#{target.lastname}")
    String getLastname();
}
     

然后我可以通过

调用查询方法
getByUsername("...", UserDetailsProjection.class)