我正在尝试查找有关如何使用Spring Data仅选择实体的某些字段的信息(我正在使用JPA)。我只想选择一个实体的特定信息,存储库接口为您提供了返回WHOLE实体信息的方法!有时我只需要一个实体的2或3个字段并返回20,30,... 100 ..字段可能有点矫枉过正。
我会使用Hibernate Criteria Projections,甚至JPA“SELECT NEW ....”查询这种功能。不知道Spring Data是否可行。
感谢。
答案 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[]
之类的东西。