我认为最简单的方法是使用所谓的投影。它可以将查询结果映射到接口。使用SqlResultSetMapping 很不方便,而且会让你的代码变得丑陋:)。
来自 Spring Data JPA 源代码的示例:
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
public static interface NameOnly {
String getFirstname();
String getLastname();
}
}
您也可以使用此方法获取投影列表。
Check out this spring data JPA docs entry for more info about projections.
注 1:
请记住将您的User 实体定义为正常 - 投影接口中的字段必须与该实体中的字段匹配。否则字段映射可能会被破坏(getFirstname() 可能会返回姓氏等值)。
注2:
如果您使用SELECT table.column ... 表示法,请始终定义与实体名称匹配的别名。例如,此代码将无法正常工作(投影将为每个 getter 返回空值):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
但这很好用:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
如果有更复杂的查询,我宁愿使用 JdbcTemplate 和自定义存储库。