java - 使用 OneToOne 映射的 Spring Boot 2 自定义查询

标签 java spring-boot spring-boot-jpa

我使用 Spring Boot 2 和 thymeleaf 来显示现有 Oracle 12 数据库中的数据。

工作流实体是我想显示的主要实体之一:

@Entity
@Immutable
@Table(name = "V_AV_WFPROC", schema="avuser")
public class Workflow {

    @Id
    @Column(name = "proc_id")
    private Long id;
    private String name;
    @Column(name = "proc_ref")
    private String procRef;
    private String description;
    @OneToOne(mappedBy = "workflow")
    private WorkflowCategory workflowCategory;

    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getProcRef() {
        return procRef;
    }
    public String getDescription() {
        return description;
    }

    public WorkflowCategory getWorkflowCategory() {
        return workflowCategory;
    }

}

workflowCategory 保存有关工作流程的一些信息,例如工作流程的类型:

@Entity
@Immutable
@Table(name = "V_AV_WFPROC_CATEGORIES", schema = "avuser")
public class WorkflowCategory {

    @Id
    @Column(name = "cat_id")
    private Long id;
    private String name;
    @OneToOne
    @JoinColumn(name="proc_id", referencedColumnName = "proc_id")
    private Workflow workflow;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Workflow getWorkflow() {
        return workflow;
    }

我有一个工作流类别的自定义查询,因为只有一些信息对我来说很重要。我需要解码类别名称,因为我无权访问存储信息的表。

@Repository
public interface WorkflowCategoryRepository extends CrudRepository<WorkflowCategory, String>{

    @Query(value = "SELECT PROC_ID || CAT_ID AS CAT_ID, PROC_ID, DECODE(CAT_ID, 4, 'Request Workflow', 5, 'Approval Workflow', 6, 'Escalation Workflow', 7, 'Fulfillment Workflow', 51, 'Custom Tasks Workflow', '?') AS NAME FROM WorkflowCategory WHERE CAT_ID IN (4, 5, 6, 7, 51)",
            nativeQuery = true)
    public Iterable<WorkflowCategory> findAll();

}

如果我尝试访问数据,我会收到以下错误消息。

More than one row with the given identifier was found: 41, for class: de.elementity.runbook.workflow.WorkflowCategory

该表包含每个工作流程的更多信息,但只有查询中的信息对我来说很重要。如何指定 @OneToOne 映射的查询?

我还尝试使用 @ManyToMany 映射,但收到以下错误消息:

2020-02-10 14:48:14.057 DEBUG 35572 --- [nio-8080-exec-1] org.hibernate.SQL                        : select wfcats0_.workflows_proc_id as workflows_proc_id2_12_0_, wfcats0_.wfCats_cat_id as wfCats_cat_id1_12_0_, wfcat1_.cat_id as cat_id1_11_1_, wfcat1_.name as name2_11_1_ from V_AV_WFPROC_CATEGORIES_V_AV_WFPROC wfcats0_ inner join avuser.V_AV_WFPROC_CATEGORIES wfcat1_ on wfcats0_.wfCats_cat_id=wfcat1_.cat_id where wfcats0_.workflows_proc_id=?
2020-02-10 14:48:14.221  WARN 35572 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 972, SQLState: 42000
2020-02-10 14:48:14.221 ERROR 35572 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-00972: idnetifier too long

2020-02-10 14:48:14.229 ERROR 35572 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "workflows": An error happened during template parsing (template: "class path resource [templates/workflows.html]")

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/workflows.html]")

当我从查询中删除 DECODE 部分时,也会发生这种情况。

最佳答案

您可以尝试在 @OneToOne 注释上使用以下属性吗?

cascade = CascadeType.ALL and orphanRemoval = true

关于java - 使用 OneToOne 映射的 Spring Boot 2 自定义查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166533/

相关文章:

java - 在 JBoss Seam 上实现 SOAP Web 服务的最佳方式是什么?

java - spring-boot :run and spring-boot:start有什么区别

java - cloudfoundry 中有多个构建包

java - 如何处理一对相关的线程对象?

java - 文件读取器的用户输入

java - Java 在运行时捕获方法的参数

java - 如何部署 "Building REST Services with Spring"教程?

java - Spring CrudRepository保存方法的自定义返回类型(动态投影)

java - 从 java -jar 运行 spring boot 应用程序时未提交事务

java - 防止@Entity重新创建数据库表 - Spring Boot