如何在jpql查询中动态连接表

时间:2016-10-05 13:33:21

标签: mysql hibernate hql jpql

我需要根据列中的数据对表进行动态连接。 例如 table:to_dos

to_do_id | value | object_id | object_type

现在这里object_type将是表名,object_id将是该表的主键,因为我的to_do表可以根据to_do的类型与多个表连接

现在,当我想从各个表中获取dos及其各自的数据时,我有以下步骤:

1-todo数据

2 - 根据对象类型

在循环中获取相应的表数据

我们可以在没有JPQL,HQL或Mysql循环的情况下执行此操作吗?我需要避免循环 还请建议是否有更优化的方式

1 个答案:

答案 0 :(得分:0)

一个解决方案是使用ToDo实体与相关ToDoTask实体类型之间的多态关联。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "TYPE")
public class Task {
  @Id
  @GeneratedValue
  private Integer id;
  @ManyToOne
  private TaskList taskList;
  @Column(name = "TYPE", insertable = false, updatable = false, nullable = false)
  private String type;
}

@Entity
@DiscriminatorValue("TYPE1")
public class SubTaskType1 extends Task {}

@Entity
@DiscriminatorValue("TYPE2")
public class SubTaskType2 extends Task {}

@Entity
public class ToDoList {
  @Id
  @GeneratedValue
  private Integer id;
  @OneToMany(mappedBy = "taskList")
  private List<Task> tasks;
}

您的代码应该简单地成为:

ToDoList todos = todoRepository.findById( todoId );
for ( Task task : todos.getTasks() ) {
  // access task.getType() to get the discriminator type 
  // or
  // use instanceof to handle subclass casting
}