2017-02-13 17 views
0

Мы используем спящий режим в нашем проекте. У нас есть запрос, который требует левого внешнего соединения. Запрос выглядит следующим образом:org.hibernate.queryexception неожиданный токен с [

Как узнать, что я использую JPQL или HQL при написании запросов.

У меня есть сценарий, когда мне нужно реализовать левое внешнее соединение в запросе.

Так что я написал 'с' вместе с левыми внешними ключевыми словами.

Но я получаю следующее исключение:

org.hibernate.queryexception unexpected token with [ 

Я читал, что с поддерживается HQL, но не с JPQL. Итак, у меня есть 2 вопроса:

1) как определить, используется ли JPQL или HQL и какая версия используется в моем проекте? 2) if 'with' не поддерживается в JPQL, то как реализовать левое внешнее соединение между двумя таблицами с определенным значением свойства.

Запрос выглядит следующим образом:

select v.vId,v.vName,cur.code,con.dxId from 
vanTb v, regionTb r, currencyTb cur, connTb con 
where 
v.vNum = r.vNum 
and v.vCode = r.vCode 
and v.vId = cur.vId 
and v.vId *= con.vId 
and con.dlId = 1234 and v.status=1 

* = -> левое внешнее соединение в базе данных Sybase ASE.

И именованный запрос как:

select v.vId,v.vName,cur.code,con.dxId from vanTb v inner join v.regionTb r inner join 
     v.currencyTb left outer join v.connTb con with con.dlId = :DlId where vendor.status = 1 

Здесь regionTb, currencyTb и connTb и vanTb является именем сущностей фасоли и vanTb.java имеет regionTb, currencyTb и connTb в ​​качестве memeber переменных.

+0

Atleast разместить свой запрос/код. .. мы можем сказать, как действовать. – Akshay

ответ

0

Правильное правило обычно заключается в том, что если ваше приложение создает EntityManagerFactory, и вы используете EntityManager для выдачи запросов, вы будете создавать запросы на основе JPQL. Если ваше приложение создавало SessionFactory, и вы используете Session для выдачи запросов, вы обычно предоставляете HQL.

Сказанное, JPA 2.1 в документации here, добавлена ​​поддержка того, что вы запрашиваете с помощью предложения ON. Поэтому для того, чтобы применить такое условие в JPQL, можно было бы написать:

String sql = "SELECT e FROM Employee e LEFT JOIN e.address a ON a.city = :city" 
Query<MyEntity> query = entityManager.createQuery(sql, MyEntity.class); 
query.setParameter("city", "New York"); 
List<MyEntity> results = query.getResulList(); 

HQL грамматику поддерживает использование пункта WITH однако следующим образом:

String sql = "SELECT e FROM Employee e LEFT JOIN e.address a WITH a.city = :city" 
Query query = session.createQuery(sql); 
query.setParameter("city", "New York"); 
List results = query.getResultList();