mysql - JPA Join Query(原生查询)自定义dto

标签 mysql jpa spring-data-jpa

您好,我正在尝试连接 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/

相关文章:

php - HTML/PHP 调查未正确传递到 MySQL 数据库

mysql - 使用 SELECT INTO OUTFILE 时出现语法错误

mysql - Ebean ManyToMany : Model A has ManyToMany<Model B> . select count(*) B where B in A's List<B>

java - Tomcat 不连接到数据库,但是当我从 netbeans 中运行它时,它工作得很好

java - Spring Boot JPA如何实现用户和权限表之间的外键?

mysql - ActiveRecord - 从关联中预取单个记录

php - MySQL MAX CONNECTIONS PER HOUR 最优值

java - 我可以在 application.yml 中为实体写入表名吗?

spring - PostgresQL + Spring JPA : org. postgresql.util.PSQLException:错误:无法将类型 bytea 转换为没有时区的时间戳

java - 如何在 Spring Boot Rest Interface 中正确划分业务层和数据层