给 OP 提供一个解决方案,比如有个文章表,和一个 User 表,我要查询所有文章列表,文章列表又要返回这篇文章的作者信息,我这里写了一个投影和一个 DTO ,用 nativeQuery 方式查询。
@
Data@
AllArgsConstructor@
NoArgsConstructorpublic class UserInfoDto {
private Long id;
private String name;
private String avatar;
}
public interface PostInfo {
long getCreateTime();
long getModifiedTime();
Long getId();
String getTitle();
String getSummary();
String getContent();
@
Value("#{new com.momo.xxx.dto.UserInfoDto(target.user_id, target.user_name, target.user_avatar)}")
UserInfoDto getAuthor();
}
user_info 表示用户表,Post 表示文章列表。
@
Query(value = "SELECT
p.id,
user_info.id AS user_id,
user_info.name AS user_name, user_info.avatar AS user_avatar,p.title,p.summary,p.CONTENT,p.state,p.create_time AS createTime,p.modified_time AS modifiedTime FROM Post p JOIN user_info ON
user_info.id=p.author_id WHERE p.is_delete = FALSE AND p.STATE = 5 ORDER BY
p.ID DESC",
nativeQuery = true)
Page<PostInfo> findAllPublishedPostsNative(Pageable pageable);
如果直接用 Spring Data Jpa 查询 10 条数据大概要 4192ms ,可能更慢,用 Native 方式可能只要 130ms ,这个数据只是我的一个测试数据;