Spring JPA: как присоединиться к полям, которых нет в объекте

У нас есть 3 объекта A, B и C. Мы ищем в таблице A с полями внутри B и C. И отображение является однонаправленным, поэтому B и Collection не определены в A. Мы используем спецификацию Spring, как мы можем выполнить соединение в этом случае без преобразования отображения в двунаправленное?

@Entity
public class A {
    @Id
    Long id
    String name
}

@Entity
public class B {
    @Id
    Long id

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    A a;
    
    @Column
    String country;
}

@Entity
public class C {
    @Id
    Long id

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "a_id")
  private A a;
}

Например, если B определено в A так,

@Entity
public class A {
    @Id
    Long id
    String name
    
    @OneToOne(mappedBy = "request")
  private B b;
    
}

Соединение будет таким

 public static Specification<A> countryEquals(String country) {
    return (root, query, builder) -> builder.equal(
        root.join("b", JoinType.LEFT).get("country"), country);
  }
  

Но B не определено в A, тогда как применить соединение?

LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать присоединиться к нему с помощью самого B, вы создаете новый корень и изображение, вы добавляете where b.a_id = a.id к своему запросу или здесь, вы CriteriaBuilder, затем вы можете добавить больше предикатов для поиска полей в таблице B. Что-то вроде этого, несколько псевдокод, потому что у меня нет своего кода здесь, и я записываю его по памяти, но я надеюсь, что это может помочь

public static Specification<A> countryEquals(String country) {
return (root, query, builder) -> (
    Root<B> b_root = query.from(B.class);
    Predicate b_join = builder.equal(b_root.get("a_id"), root.get("id"))
    Predicate b_country = builder.equal(b_root.get("country"), country) // or like with `%country%`
    return builder.and(other_predicate,...., b_join, b_country)
  )
}

Другие вопросы по теме