【问题标题】:How to make dynamic join to tables in jpql query如何在 jpql 查询中对表进行动态连接
【发布时间】:2017-02-13 23:39:02
【问题描述】:

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

to_do_id | value | object_id | object_type

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

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

1-获取待办事项数据

2-根据对象类型循环获取各个表数据

我们可以在 JPQL、HQL 或 MySQL 中不使用循环吗?我需要避免循环 也请建议是否有任何更优化的方式

【问题讨论】:

    标签: mysql hibernate hql jpql


    【解决方案1】:

    一种解决方案是在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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 2014-10-22
      • 2022-12-08
      • 1970-01-01
      • 2018-07-06
      • 2020-10-05
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多