Запрос на присоединение к гибернации без прямого подключения

У меня следующий класс сущности

public class Customer {
    @Id
    private int id;
    @Column(name = "CID")
    private String cid;
}


public class Alccs {
    @Id
    private int vid;
//    @Column(name = "CID")
//    private String cid;

    @ManyToOne
    @JoinColumn(name = "CID", referencedColumnName = "CID")
    private Customer customer;
}


public class Rtwo {
    @Id
    private int jobNo;

    @ManyToOne
    @JoinColumn(name = "CID", referencedColumnName = "CID")
    private Customer customer;
}




public class RTwoCycle {
    @Id
    private int cycleJobNo;
    @Column
    private int vid;

    @ManyToOne
    @JoinColumn(name = "JobNo", referencedColumnName = "JobNo")
    private TblRtwo tblRtwo;

}

Как написать следующий запрос, используя HQL и criteria

select top 20 * from RTwoCycle rtCycle join Alccs al on rtCycle.vid = al.vid;

Для HQL я пробовал следовать

from TBLRTwoCycle rtCycle join TBLAL al on rtCycle.vid = al.vid

но появляется ошибка QuerySyntaxException: Path expected for join!

а насчет критериев я не знаю, как это сделать

как это сделать ??

вы пробовали использовать nativeQuery? вы используете spring-data-jpa?

Angad Bansode 10.09.2018 11:54

я не использую весну

LynAs 10.09.2018 14:30
0
2
104
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Версии JPA и Hibernate старше 5.1 требуют определенного отношения для соединения двух сущностей в запросе JPQL. Это часто приводит к каскадным операторам JOIN для обхода графа отношений между сущностями или к утверждению, что JOIN сущностей невозможно с JPQL, если между ними нет взаимосвязи.

Hibernate 5.1 представил явные соединения для несвязанных сущностей. Синтаксис очень похож на SQL и позволяет определять критерии JOIN в операторе ON.

Больше информации

  1. from RTwoCycle as rtCycle inner join Alccs as al with rtCycle.vid = al.vid

как делать с session.createCriteria?

LynAs 10.09.2018 14:30

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

Nick 10.09.2018 14:51

Вы не можете присоединиться к несвязанным объектам с помощью Criteria API. Попробуйте это с помощью hql, как описано выше.

Seymur Asadov 10.09.2018 15:02
Ответ принят как подходящий

Для HQL достаточно простого соединения и достаточно on clause

from table1 as t1 inner join table2 as t2 on t1.vid=t2.vid

или

from table1 as t1, table2 as t2 where t1.vid=t2.vid

для критерия Restriction.sqlRestriction - решение этой проблемы

session.createCriteria(Class1,"c1")
        .createAlias("class2", "c2")
        .add(Restrictions.sqlRestriction("c1.vid=c2.vid")

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