2013-11-18 4 views
-1

У меня есть класс компьютера, и каждый из них может быть собран. Мне нужно получить те записи класса Computer, у которых есть Assembler. Я пытался использовать критерии, но не смог их получить.Как получить все записи, которые существуют в определенных отношениях?

@Entity 
public class Computer{ 
    .... 
    @OneToMany 
    private Set <Assembler> assemblers; 
    .... 
} 

@Entity  
public class Assembler{ 
    ... 
    @OneToOne 
    private User user; 

    @OneToMany 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<Tools> tools; 
    .... 
} 

@Entity 
public class Tools{ 
    .... 
    @OneToOne 
    private Electronic electronic; 

    @OneToOne 
    private Manual manual; 

} 

Код

Criteria cre = session.createCriteria(Computer.class, "computer") 
         .createAlias("computer.assembler", "assem") 
cre.add(Restrictions.not(Restrictions.eq("assem.id",null))); 
List computer = (List<Computer>) cre.list(); 
System.out.println(computer.size()): << returns zero but should return 1 
+0

Что именно вы пытаетесь? –

+0

Код @brano добавлен – J888

+0

Вам нужно использовать критерии, или вы можете использовать HQL? –

ответ

2

Вместо использования:

cre.add(Restrictions.not(Restrictions.eq("assem.id",null))); 

Try:

cre.add(Restrictions.isNotEmpty("assemblers")); 

(удалить псевдоним)

-1
List<Computer> list = session.createCriteria(Computer.class).setProjection(Projections.projectionList() 
    .add(Projections.property("property.field1")).list(); 
+0

, он не возвращает все компьютерные записи? – J888

+0

Неправильно вы не можете установить projections.property в методе критериев, также не используя «как» – J888

+1

http://www.java4s.com/hibernate/example-on-hibernate-criteria-with-multiple-projections/ Я не уверен, что вы подразумеваете под последним комментарием, но удачи. –

1
from Computer computer inner join computer.assemblers as assem 
+0

он возвращает «таблица computer.assemblers» не существует », так как это отношение« один ко многим », я изменил это на computer_assemblers, но результат показал все переборщики компьютеров. – J888

+0

Хм, может это из-за псевдонима? Что делать, если вы говорите «от компьютера c внутренним соединением c.assemblers as assem»? –

+0

та же проблема, когда я меняю ее на computer_asseblers, она отображает все записи компьютера и добавляет столбец ассемблера ко всем из них, указав идентификатор одного из ассемблеров, который связан только с одним из них. – J888

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