Hibernate: объедините три таблицы, используя HQL или Criteria. (Я использовал Interceptor для доступа к нескольким таблицам из одного класса Entity) - PullRequest
0 голосов
/ 16 января 2020

Я использую пользовательский перехватчик для доступа к нескольким таблицам из одного класса Entity (так как другие таблицы следуют той же структуре). Я заменяю имя таблицы, используя перехватчик во время выполнения, чтобы добиться того же, что показано ниже.

    Session session = sessionFactory.withOptions().interceptor(
    new CustomInterceptor("table_b", "table_c")).openSession();  

Как и выше, я получаю доступ к table_d, table_e et c.

Я смог объединить две таблицы (например, Table_A и Table_ C), используя критерии, изменив имя таблицы через CustomIntercetor.

Теперь у меня есть сценарий использования, когда мне нужно объединить три стола. И я сильно поражен и не могу идти дальше. Я погуглил и изучил большинство вопросов StackOverflow, но все равно ничего не нашел.

Если кто-то из вас решил это или столкнулся с этим вариантом использования, поделитесь своими мыслями.

два варианта На данный момент я могу подумать: (не уверен, правильно ли использовать нижеприведенные параметры)

Вариант 1 : использовать SQL query session.createSQLQuery(sqlQuery);

Option 2 : передать весь запрос, связанный с таблицей 3, из CustomInterceptor - неправильный подход

Добавление кода ниже

TableA

@Setter
@ToString
@Getter
@Builder(toBuilder = true)
@Entity
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@Table(name = "Table_A")
public class TableA {

    @NonNull
    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "dummyA")
    private String dummyB;

    @Column(name = "dummyB")
    private String dummyB;

   @OneToOne
    @JoinColumn(name = "tableB_id")
    private TableB tableB;

}

TableB


@Setter
@ToString
@Builder(toBuilder = true)
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Table(name = "Table_B")
public class TableB {

    @Id
    @Column(name = "tableB_id")
    private String tableBID;

    @Column(name = "dummyC")
    private String dummyC;

    @Column(name = "dummyD")
    private String dummyD;

}

CustomInterceptor

   @Slf4j
   @AllArgsConstructor
   public class CustomInterceptor extends EmptyInterceptor {

    private String originalQueryPart;
    private String replaceQueryPart;

    @Override
    public String onPrepareStatement(String sqlQuery) {
        log.info("Query before modifying: ->{}", sqlQuery);
        String modifiedQuery = getUpdatedQuery(sqlQuery);
        log.info("Query after modifying: ->{}", modifiedQuery);
        return modifiedQuery;
    }

    private String getUpdatedQuery(sqlQuery){
     //logic
    return query; 
    }

    }
...