1 Востаннє редагувалося colin200x (25.12.2023 18:48:19)

Тема: Hibernate CriteriaBuilder i inner join

Доброго дня, товариство.
Не можу ніяк розібратися, як зробити простий запит, ось такого плану, але з допомогою CriteriaBuilder в Hibernate.

SELECT units.model, works.task, works.opened 
FROM works inner join units on works.unit_id = units.id_unit
where opened = 1;

MySQL видає ось таку таблицю(з ліва), а код який генерує запит(з права) приведу нижче
https://replace.org.ua/extensions/om_images/img/6589b31abc219/f1ba9b798c72259cd96584ed2d06c47c.jpg

CriteriaQuery<Work> cq = builder.createQuery(Work.class);
Root<Work> rootW = cq.from(Work.class);
rootW.join("unit");
cq.where(builder.equal(rootW.get("opened"), true));
Query<Work> query1 = session.createQuery(cq);
List<Work> resultList1 = query1.getResultList();

resultList1.forEach((w)->{ System.out.println("\t"+ w.getTask()); });

Отож, як згенерувати запит так, щоб було поле units.model. зв'язок між таблицями, як видно по ентиті, OneToMany, тобто один Unit має багато WORKів.

// Unit.java
@Entity
@Table(name = "units")
public class Unit {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_unit")
    private int idUnit;
    
    @Column(name = "model")
    private String model;
    
    @OneToMany(mappedBy = "unit", cascade = CascadeType.ALL)
    private List<Work> works = new ArrayList<Work>();

       // далі ідуть Getters i Setters}

// Work.java
@Entity
@Table(name = "works")
public class Work {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_work")
    private int idWork;
    
    @Column(name = "task")
    private String task;
    
    @Column(name = "opened")
    private boolean opened;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "unit_id")
    private Unit unit;
}

2

Re: Hibernate CriteriaBuilder i inner join

так розумію цей форум втратив свою актуальність....

3 Востаннє редагувалося leofun01 (22.01.2024 12:47:35)

Re: Hibernate CriteriaBuilder i inner join

при чому тут Java? читай книжки із SQL

4

Re: Hibernate CriteriaBuilder i inner join

Пане ur_naz, вам не важко буде назвати книжку з SQL, яка б описувала, як робити такий запит за допомогою CriteriaBuilder в Hibernate? Думаю, що важко. Бо це питання саме з конкретної бібліотеки Java.

Але в цілому кудись ми не туди звернули. Пишеш мовою високого рівня? Пиши. Треба, щоб фрагмент генерував конкретний асемблерний код, бо оптимізуючого компілятора недостатньо? Роби асемблерну вставку, тільки залиши примітку, чому тут цей код, а ще краще - закоментуй неоптимізований високорівневий код, щоб можна було нормально його редагувати. Пишеш роботу з базою на ORM? Пиши. Треба, щоб фрагмент генерував конкретний код? Роби вставку з цим кодом.
А всі тонкі підгонки на кшталт поміняти місцями два рядки, створити додатковий об'єкт, додати якусь складну конструкцію, яку компілятор конкретної версії потім розбере як слід і т.д. - це, як на мене, дурниця. Бо колись вийде нова версія, яка зможе ваш повільний код оптимізувати, але ваш "швидкий" код буде її збивати. Мови високого рівня потрібні для читаності, низького - для швидкості.
Ну ось приклад з inner join: https://stackoverflow.com/questions/552 … g-criteria - але я який сенс у цьому, якщо написати простий запит значно легше руками?

Подякували: colin200x, leofun012

5

Re: Hibernate CriteriaBuilder i inner join

Дякую за відповідь. Я доволі новачок в hibernate, та й можна сказати в програмуванні в цілому. тому і ставлю банальні питання. Ваше посилання пане Лінива тварина, вже вивчаю!

(правда і половини не зрозумів про що тут йдеться, ви мали на увазі, нафіга мені крітерія якщо sql достатньо швидкий?)) )

Але в цілому кудись ми не туди звернули. Пишеш мовою високого рівня? Пиши. Треба, щоб фрагмент генерував конкретний асемблерний код, бо оптимізуючого компілятора недостатньо? Роби асемблерну вставку, тільки залиши примітку, чому тут цей код, а ще краще - закоментуй неоптимізований високорівневий код, щоб можна було нормально його редагувати.


А пану "ur-naz"у, скажу наступне - обсирати простіше всього і Java як раз там до всього. Якщо моє питання вирішується банальним запитом в SQL, то це я і без вас пане ur-naz знаю, але я його хотів зробити за допомогою CriteriaBuilder, і коли мені в що вивчати, це вас абсолютно не стосується.

p/s по-більше б таких українців як пан Лінива тварина!