您好,我正在尝试连接 3 个表并使用以下查询获取集体结果,即 dto
SELECT f.id, u.email,
count(distinct l.id) as likes_count,
count(distinct c.id) as comments_count
FROM feeds f
INNER JOIN users u ON f.user_id = u.id
INNER JOIN likes l on l.feed_id = f.id
left join comments c on c.feed_id = f.id
WHERE u.id = 12055
group by f.id order by comments_count asc;
此查询在 mysql 工作台中工作正常,当我尝试将此查询添加到 @Query
注释时,我收到 AbstractJpaQuery$TupleConverter$TupleBackedMap
异常,对此的解决方案是使用 ContructorExpression
我添加了 new
表达式,但我没有让它工作,我的数据库实体如下
@Entity
@Table(name = "feeds")
@NoArgsConstructor
public class Feed {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Getter
@Setter
Long id;
@Getter
@Setter
@Column(columnDefinition = "TEXT")
String content;
public Feed(String content, User user) {
this.content = content;
this.user = user;
}
@ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Getter
@Setter
User user;
@OneToMany(mappedBy = "feed", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@Getter
@Setter
List<Like> likes;
@OneToMany(mappedBy = "feed", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@Getter
@Setter
List<Comment> comments;
@Override
public String toString() {
return "Feed{" +
"id=" + id +
", user=" + user +
'}';
}
}
上述 sql 查询的自定义 DTO 对象:
@NoArgsConstructor
@AllArgsConstructor
public class FeedDetails {
@Getter
@Setter
private Long id;
@Getter
@Setter
private Long likes;
@Getter
@Setter
private Long comments;
}
Repository
方法如下:
@Query("**sql_query**")
List<FeedDetails> findAllFeedsByUserId(Long userId);
我不确定我在 sql_query
中写了什么,以便获得正确的 FeedDetails
List
结果。
最佳答案
您不能将构造函数表达式(NEW 运算符)与 native 查询一起使用。
您可以使用 JPA 构造函数结果。这看起来像:
Query q = em.createNativeQuery(
"SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " +
"FROM Customer c " +
"JOIN Orders o ON o.cid = c.id " +
"GROUP BY c.id, c.name",
"CustomerDetailsResult");
@SqlResultSetMapping(name="CustomerDetailsResult",
classes={
@ConstructorResult(targetClass=com.acme.CustomerDetails.class,
columns={
@ColumnResult(name="id"),
@ColumnResult(name="name"),
@ColumnResult(name="orderCount"),
@ColumnResult(name="avgOrder", type=Double.class)})
})
或者您可以将 FeedDetails 转换为接口(interface)并尝试 Spring Data JPA Interface 投影:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
或者,如果您不喜欢这些选项,可以使用一个名为 QLRM 的小库:https://github.com/simasch/qlrm/blob/master/ConstructorResult.md
关于mysql - JPA Join Query(原生查询)自定义dto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55897874/