【问题标题】:Inner join three tables to java DTO将三个表内连接到 java DTO
【发布时间】:2019-10-19 01:06:22
【问题描述】:

我面临以下问题...

我试图以这种方式拥有processsubprocessProcessDTO 对象的java 列表:

[{"process": {
   "code": "AB",
   "name": "Proc1"
   "subprocesses": 
    [{"code": "cd", "name": "subProc1"}],
    [{"code": "ef", "name": "subProc2"}],
    [{"code": "gh", "name": "subProc3"}]
  }
}]

这是我到现在为止的:

SELECT distinct C.code as process_code, C.name as process_name, A.code as subprocess_code, A.name as subprocess_code FROM subprocess A 
inner join zone B
    on A.id = B.subprocess_id
inner join process C
    on C.id = B.process_id
    ORDER BY C.code;

但是当我创建 DTO 类时:

public class ProcessDto {

    private Long id;
    private String code;
    private String name;
    private List<Subprocess> subprocess;

}

还有查询:

@RepositoryRestResource(itemResourceRel = "process", collectionResourceRel = "processes", path = "process")
public interface ProcessDataRestRepository extends JpaRepository<Process, Long> {

    @Query("Select p.code, p.name, sp.code, sp.name " +
            "from Process p " +
            "inner join Zone z on p.id = z.process " +
            "inner join Subprocess sp on sp.id = z.subprocess")
    List<ProcessDto> findProcessesAndSubprocesses();

}

我收到以下错误:

org.springframework.core.convert.ConverterNotFoundException: 否 发现能够从类型转换的转换器 [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 输入 [dto.ProcessSubprocess]

我不确定这是否是正确的方法。

一种肮脏的方法是查找所有进程,存储在一个对象中,然后迭代它们并找到所有子进程......

还有其他方法可以将 de BBDD 中的所有内容都带入一个对象中吗?

【问题讨论】:

    标签: java spring postgresql spring-boot spring-data-jpa


    【解决方案1】:

    从该 DTO 创建一个接口,以便 Spring 引擎可以拾取它并自动创建一个结果对象:

    public interface ProcessDto {
    
        Long getId();
        String getCode();
        String getName();
        String getSubprocessName();
    
    }
    

    更多关于主题here

    【讨论】:

    • 我刚刚这样做了,这很有意义,我越来越近了。问题是我需要将子进程作为一个列表,实际上我得到了一个像这样的对象:{name: "Proc1", id: 1, code: "AB", subprocessName: "subProc1", subprocessCode: "cd"}。有什么办法可以在界面中加入List&lt;Subprocess&gt; getSubprocesses()
    • 你应该可以。只需为 Subprocess 再创建一个 itnerface 并在 ProcessDto 接口中将其用作 getter。首先尝试运行 findAll()。
    • 我试过了,它对@ManyToOne 很有效,但列表似乎没有被选中。您可能需要自定义解析器或为每个进程运行查询以获取子进程。但第二种选择可能会减慢速度。
    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多