Nano Hash - криптовалюты, майнинг, программирование

Как получить сложный класс и его члены с помощью Hibernate Projection?

У меня есть следующий класс, который нужно получить из БД с помощью Hibernate. Проблема в том, что в моем классе несколько членов, и большинство из них являются классами, как я могу их получить?

@Entity
public class Student {
  @Id
  long id;
  String name;
  String fname;
  @OneToMany
  List<Course> courses;
  @ManyToOne
  Dealer dealer;
  ...
}

@Entity
public class Dealer {
   @Id
   long id;
   String name; 
   @OneToMany(fetch = FetchType.LAZY, mappedBy = "cr.dealer", cascade = CascadeType.ALL)
   Set<Car> cars = new HashSet<Cars>(0);
   ..

}

Мне нужно получить идентификатор студента 1 и все его курсы, его дилера и список автомобилей дилеров.

Моя проекция выглядит следующим образом, но она ничего не возвращает.

  ...
    .setProjection(Projections.projectionList()

    .add(Projections.property("friends.cars").as("cars")
    ...

Ответы:


1

Поскольку у вас есть список курсов и набор автомобилей, вы можете просто получить весь график одним запросом:

select s
from Student s
left join fetch s.courses
left join fetch s.dealer d
left join fetch d.cars
where s.id = :id

Поскольку вы выбираете две коллекции, этот запрос сгенерирует декартово произведение, поэтому вам нужно убедиться, что в выбранных дочерних коллекциях не слишком много записей.

Если вы не хотите столкнуться с декартовым произведением, вы можете просто запустить этот запрос:

select s
from Student s
left join fetch s.courses
left join fetch s.dealer d
where s.id = :id

а затем вы обращаетесь к дилеру.cars, чтобы получить эту коллекцию с помощью отдельного запроса:

Student s = ...;
s.getDealer().getCars().size();
19.04.2015
  • Спасибо за ваш ответ, не могли бы вы взглянуть на мой вопрос по адресу stackoverflow.com/questions/29980421/ 31.05.2015

  • 2

    Если высокая производительность не вызывает беспокойства, вы должны позволить Hibernate делать свою работу. Просто используйте геттеры ваших сущностей. Например:

    Student student1 = session.get(Student.class, 1L);
    List<Course> courses = student1.getCourses();
    Dealer dealer = student1.getDealer();
    Set<Car> cars = dealer.getCars();
    
    17.04.2015

    3

    Я не уверен, что вы можете использовать QueryOver, но для таких задач это было бы очень просто.

    Student student = null;
    Dealer dealer = null;
    Course course = null;
    Car car = null;
    
    var myStudent = Session.QueryOver<Student>(() => student)
    .Left.JoinQueryOver(() => student.courses, () => courses)
    .Left.JoinQueryOver(() => student.dealer, () => dealer)
    .Left.JoinQueryOver(() => dealer.cars, () => car)
    .SelectList(list => list
      .Select(() => student.Name)
      .Select(() => student.Age)
      .Select(() => courses.Description)
      .Select(() => dealer.locaiton)
      .Select(() => car.Model))
      .TransformUsing(Transformers.AliasToBean<StudentModel>())
      .List<StudentModel>().AsQueryable();
    

    Создайте DTO StudentModel, чтобы получить результаты. Это всего лишь подсказка для начала, вы можете изменить это в соответствии с вашими требованиями. Надеюсь, это сработает. :)

    21.04.2015

    4
  • Спасибо за ваш ответ, у меня есть новая проблема с этим, и я опубликовал новый вопрос по этой проблеме, пожалуйста, посмотрите, спасибо, stackoverflow.com/questions/29980421/ 01.05.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..