как сгенерировать hql-запрос для OneToOne - PullRequest
0 голосов
/ 11 июня 2018

у меня есть класс брендов, который отображается как один-на-один с классом спецификации MobileBrands.class:

private int id;
private String name;
private int price;
@OneToOne
private MobileSpecification prodInfo;

MobileSpecification.class:

private int id;
private String ram;
private String rom;
@OneToOne
private MobileBrands brands;

Я знаю, что sql работает нормально.

SQL:

select mobile_brands.id, mobile_brands.name, specification.ram, specification.rom 
        from mobile_brands inner join specification on 
            mobile_brands.brand_id=specification.ID where mobile_brands.BRAND_ID='1'

И хотя я новичок в HQL Query, вот что я попробовал:

SELECT u.id as id, u.name as name, 
    u.prodInfo.ram as ram, u.prodInfo.rom as rom from MobileBrands inner join MobileSpecification 
        with MobileBrands.id=MobileSpecification.id where MobileBrands.id='1'"

Что не работает (HQLодин).Как конвертировать его в HQL?

1 Ответ

0 голосов
/ 19 июня 2018

Изменить с:

SELECT u.id as id, u.name as name, 
u.prodInfo.ram as ram, u.prodInfo.rom as rom from MobileBrands inner join MobileSpecification 
    with MobileBrands.id=MobileSpecification.id where MobileBrands.id='1'"

На:

select new com.package.app.MobileDto(mb.id, md.name, ms.rom, ms.ram) FROM MobileBrands mb, MobileSpecification ms WHERE mb.id = 1 and mb.id = ms.id

Как видите, я использую класс MbDto для получения каждой информации.Вы можете создать этот класс в пакете (за пример) com.package.app с помощью конструктора для полей:

class MbDto {

    MbDto(int id, String name, String ram, String rom) {
         // constructor will all fields
    }
}

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

String jpql = "select new com.package.app.MobileDto(mb.id, md.name, ms.rom, ms.ram) FROM MobileBrands mb, MobileSpecification ms WHERE mb.id = 1 and mb.id = ms.id";
Query query = entityManager.createQuery(jpql);
MbDto mbDto = query.getSingleResult();

В более новых версиях Hibernate можно создавать JOIN без отношения, но это не является необходимым для вашей проблемы.

Но обратите внимание, что вы не используете сопоставленные отношения между этими двумя объектами.Если вы попытаетесь это сделать, запрос будет:

select mb FROM MobileBrands mb JOIN mb.productInfo pi WHERE mb.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...