2014-08-27 2 views
0

Я наткнулся на проблему с Hibernate. Я 2 сущности - скажем А и В, как так (Entity/Таблица аннотации опущены):спящий порядок по вложенному объекту с возможными нулевыми значениями

class A { 
    @ManyToOne 
    @JoinColumn(name = "b_id") 
    private B b; 
} 

class B { 
    @Column(name = "name") 
    private String name; 
} 

Теперь я пытаюсь запросить все A сущности и заказав их имени области б «ы лицо как так:

SELECT q FROM A AS q ORDER BY q.b.name asc nulls last 

проблема в том, есть строки в » таблицы с нулевой имеющие внешний ключ (б равна нулю) - в ре sult, указанный выше запрос возвращает только строк, которые не содержат нуля в поле b, и я хотел бы иметь их все.

Я думаю, что спящий режим соединяется с таблицей без использования LEFT JOIN (OUTER JOIN?), В результате чего пропускаются пустые значения.

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

+0

Что вы подразумеваете под * механизм генерации запроса, который довольно заперт *? –

+0

Это очень общий, и здесь я получил специальный случай, который происходит в 0,001% всех запросов, когда-либо сделанных. – Marcin

ответ

0

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

Criteria criteria = session.createCriteria(A.class) 

//create alias of your other class to provide ordering according to foriegn key 

criteria.createAlias("foreignkey","keyin table A(eg..b)"); 
criteria.addOrder(Order.asc(b.name)); 
List list = criteria.getlist(); 

надеюсь, что это помогает

+0

Я не могу использовать какой-либо другой механизм - мы создаем запросы JPQL в виде строк, потому что у нас есть довольно большой механизм создания запросов на фронт. – Marcin

0

Вы можете использовать CriteriaBuilder и set alias on entityRoot

Root<A> entityRoot = criteriaQuery.from(A); 
entityRoot.join("b", JoinType.LEFT).alias("b"); 
criteriaQuery.select(entityRoot) 
       .orderBy(criteriaBuilder.asc(entityRoot.get("b").get("name")) 

;

Смежные вопросы