选择Spring Data上的字段

时间:2012-11-08 13:53:25

标签: java spring select jpa spring-data-jpa

我正在尝试查找有关如何使用Spring Data仅选择实体的某些字段的信息(我正在使用JPA)。我只想选择一个实体的特定信息,存储库接口为您提供了返回WHOLE实体信息的方法!有时我只需要一个实体的2或3个字段并返回20,30,... 100 ..字段可能有点矫枉过正。

我会使用Hibernate Criteria Projections,甚至JPA“SELECT NEW ....”查询这种功能。不知道Spring Data是否可行。

感谢。

3 个答案:

答案 0 :(得分:3)

您可以做的是从存储库返回List<Object[]>。然后在您的服务类中迭代此列表并手动创建所需的对象。样本存储库方法

@Query("select el.moduleId, el.threadId from ExceptionLog el")
public List<Object[]> tempQuery();

答案 1 :(得分:2)

我认为你也可以这样做

SomeDataPOJO{
    required col1
    required col2
}

然后像这样写

@Query("select new SomeDataPOJO from requiredTable where xyz="abc")
public List<SomeDataPoJO> tempQuery()

答案 2 :(得分:0)

它不是纯Spring数据,但是您考虑使用Springs JdbcTemplate吗?如果您使用Spring Boots Autoconfiguration,并且在上下文中有多个用于转换查询结果的处理程序,那么它也在上下文中。

例如,您可以使用查询SELECT a, b FROM EMPLOYEE WHERE ID = ?

String query = "SELECT a, b FROM EMPLOYEE WHERE ID = ?";
List<Pair<String,Integer>> employees = jdbcTemplate.queryForObject(
query, new Object[] { id }, new ExampleRowMapper());

ExampleRowMapper将结果中的每一行转换为给定的Return类型(在这种情况下为Pair<String, Integer>),并且看起来像

public class ExampleRowMapper implements RowMapper<Pair<String, Integer>> {
    @Override
    public Pair<String, Integer> mapRow(ResultSet rs, int rowNum) throws SQLException {
        return Pair.of(rs.getString(1), rs.getString(2));
    }
}

https://www.baeldung.com/spring-jdbc-jdbctemplate改编而成的示例,您可以在其中找到更多信息。

当然,它不像JPQL那样具有类型安全性,因为查询是“原始”或“本机” SQL,但至少响应还是具有类型安全性,而且我更喜欢返回Object[]之类的东西。