2015-03-03 5 views
2

У меня есть некоторые проблемы с Hibernate (JPA), PostgreSQL и упорядочением.Java Hibernate ManyToOne Ordering

К примеру, у нас есть две таблицы (сопоставленные лиц):

- Pets (id (id), PetTypes (types_id), description (description)) 

- PetTypes (id (id), name (name)) 

type_id поле не требуется (ограничение на pet_types таблицу).

Например, у нас есть 10 строк в таблице домашних животных (в 1, 2 и 3 строках type_id равно null). Мне нужно заказать таблицу домашних животных pet_types.name с использованием критериев HQL или JPA (но я думаю, что это не поддерживается JPA).

Проблема: значения из таблицы домашних животных не выбираются с заказом, если type_id равно null. Я могу попытаться использовать следующие решения:

  1. ИЗ Домашних животных Домашних животных ORDER BY pets.petTypes.name ASC NULLS ПОСЛЕДНЕЙ
  2. ОТ Домашних животных Домашних животных ORDER BY СЛУЧАЯ КОГДА pets.petTypes IS NULL THEN 0 ELSE 1 END , ORDER BY pets.petTypes.name ASC NULLS LAST
  3. ОТ Домашние животные ORDER BY случае, когда pets.petTypes.name IS NULL THEN 0 ELSE 1 END, ORDER BY pets.petTypes.name ASC NULLS LAST
  4. от домашних животных домашних животных LEFT JOIN pets.petTypes ORDER BY pets.petTypes.name ASC NULLS LAST
  5. FROM Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные Домашние животные ЗАКАЗАТЬ pets.petTypes.name ASC

Но ничего не работает. После выбора у нас 7 вместо 10 строк. Есть идеи? Я не могу использовать инструкцию UNION через HQL. Он открыт Hibernate bug с 2005

EDIT

Thx к Rodrigo Menezes. Это решение работает:

select p from Pets p left join p.petTypes pt order by case when pt is null then 0 else 1 end, pt.name

+0

Может быть, вам нужно два порядка (не конечно). Потому что «pets.petTypes» имеет значение null, а не pets.petTypes.name или? что-то вроде ORDER BY pets.petTypes ASC NULLS LAST, pets.petTypes.names ASC – pL4Gu33

+0

Да, я попытался использовать этот метод. Ничего не работает. Я обновляю вопрос выше. –

+0

Порядок сортировки не должен влиять на количество строк. Можете ли вы опубликовать исходный SQL-дамп? – dfb

ответ

1

Может быть, ваш HQL порождает внутренний или перекрестное соединение.

Вы можете заставить левую присоединиться:

select p from Pets p 
left join p.petTypes pt 
order by case when pt is null then 0 else 1 end, pt.name 

Я сделал тест случай и работал:

public static void main(String[] args) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 

    session.beginTransaction(); 

    PetTypes dog = new PetTypes(); 
    dog.setName("Dog"); 
    dog.setId(1); 
    PetTypes cat = new PetTypes(); 
    cat.setName("Cat"); 
    cat.setId(2); 

    session.save(dog); 
    session.save(cat); 

    int id = 1; 
    Pets joe = new Pets(); 
    joe.setId(id++); 
    joe.setDescription("Joe"); 

    Pets x = new Pets(); 
    x.setId(id++); 
    x.setDescription("Sarah");  
    x.setPetTypes(dog); 

    Pets y = new Pets(); 
    y.setId(id++); 
    y.setDescription("Jakob");  
    y.setPetTypes(cat); 

    Pets z = new Pets(); 
    z.setId(id++); 
    z.setDescription("Xena");  
    z.setPetTypes(cat);     

    session.save(joe); 
    session.save(x); 
    session.save(y); 
    session.save(z); 

    session.getTransaction().commit(); 

    Query q = session.createQuery("select p from Pets p " 
      + "left join p.petTypes pt " 
      + "order by case when pt is null then 0 else 1 end, pt.name "); 

    List<Pets> resultList = q.list(); 
    System.out.println("num of employess:" + resultList.size()); 
    for (Pets next : resultList) { 
     System.out.println("pet " + next); 
    } 
} 

Результат:

num of pets:4 
pet Pets [description=Joe, petTypes=null] 
pet Pets [description=Jakob, petTypes=PetTypes [name=Cat]] 
pet Pets [description=Xena, petTypes=PetTypes [name=Cat]] 
pet Pets [description=Sarah, petTypes=PetTypes [name=Dog]] 
+1

Спасибо, это работает. –

+0

Отлично, очень добро пожаловать! –

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