6

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

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

谢谢。

4

3 回答 3

3

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

@Query("select el.moduleId, el.threadId from ExceptionLog el")
public List<Object[]> tempQuery();
于 2012-12-20T03:05:29.077 回答
2

我想你也可以这样做

SomeDataPOJO{
    required col1
    required col2
}

然后像这样写查询

@Query("select new SomeDataPOJO from requiredTable where xyz="abc")
public List<SomeDataPoJO> tempQuery()
于 2016-01-08T07:01:30.907 回答
0

它不是普通的 Spring Data,但你考虑过使用 SpringsJdbcTemplate吗?如果您使用 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每一行转换为给定的返回类型(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[]或其他东西。

于 2019-12-11T12:57:09.893 回答