Я использую пользовательский перехватчик для доступа к нескольким таблицам из одного класса 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;
}
}