2015-10-16 142 views
0

不幸的是,我不确切地知道如何解释这个问题。我将如何使用jpa查询jpa对象列表中的参数

我有两个表只有松散的关系,PERSON和ASSIGNMENT。

public class Person { 

    @EmbeddedId 
    @Column 
    PersonPK id; 

    @Column 
    String otherStuff; 
} 

public class PersonPK { 

    @Column 
    long personNumber; 

    @Column 
    Date hireDate; 

    @Column 
    Date terminationDate; 
} 

public class Assignment { 
    @Id 
    @Column 
    long id; 

    @Column 
    long personId; 

    @Column 
    boolean active; 

    @Column 
    String otherStuff; 
} 

的人一个很容易获得与FROM Person p WHERE [current date in between hire and termination]

,但我需要做的工作分配的第二个查询,我想只是传递的人的名单早在代替剥离出来的id 。所以像FROM Assignment a WHERE a.personId IN :persons.id.id AND a.active = true

这是可能与JPA查询?

回答

0

似乎有点好奇,有一个@EmbeddedId这样的日期字段。说实话,我失去了PersonPK类做这样的事情:

public class Person { 
    @Id 
    @Column 
    long personNumber; 

    @Column 
    Date hireDate; 

    @Column 
    Date terminationDate; 

    @Column 
    String otherStuff; 
} 

public class Assignment { 
    @Id 
    @Column 
    long id; 

    @ManyToOne 
    Person person; 

    @Column 
    boolean active; 

    @Column 
    String otherStuff; 
} 

那么你应该能够传递人的名单查询:

List<Person> people = /* your list of people */ 
Query query = manager.createQuery("select a from Assignment a where a.person in :people"); 
query.setParameter("people", people); 
List<Assigment> assignments = query.getResultList() 

这工作,因为你实际上是在PersonAssignment类别与@ManyToOne注释之间建立链接。

编辑:看,你无法改变的模式我只是添加静态帮手的人得到personNumbers为您提供:

public static List<Long> toPersonNumbers(List<Person> people) { 
    List<Long> numbers = new ArrayList<Long>(); 
    for (Person person: people) { 
     numbers.add(person.id.personNumber); 
    } 
    return numbers; 
} 

然后,你可以调用,当你需要设置参数:

List<Person> people = /* your list of people */ 
Query query = manager.createQuery("select a from Assignment a where a.personId in :people"); 
query.setParameter("people", toPersonNumbers(people)); 
List<Assigment> assignments = query.getResultList() 
+0

我没有这个选项。主键的定义与数据库中的一样。每当有人退出并被重新雇用时,他们都会使用具有不同日期的同一员工号码。所以,如果我说只是'personId'是关键,我得到一个重复的关键错误 – mike

+0

好吧,想想你可能不幸运。我会发布一个辅助函数... –