Я использую 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();
}
Если я пытаюсь получить доступ к данным, я получаю следующее сообщение об ошибке.
Найдено более одной строки с данным идентификатором: 41, для класса: 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
из запроса.