在条件构建器中编写查询,以便将join与condition结合使用

时间:2016-01-12 07:21:32

标签: java jpa eclipselink criteria query-builder

select * from person as p join personal_information as pi on p.id=pi.personId
where p.cellNumber='1234567890' or pi.cellNUmber='123456789';

以下是Person表的结构:

`id` `name` `cellNumber` `emailAddress`

以下是personal_information表的结构:

`id` `personId`(foreign key from Person table) `cellNumber`

现在我处于一种需要取特定细胞数的人的情况。让我们说根据我的查询它是123456789 并且Person表有一个cellNumber为000000000 所以记录就像:

101 John 000000000 'abc@gmail.com'

但personal_information表有5条具有该cellNumber的记录 例如 personal_information表

1 101 123456789
2 102 123456789
3 103 123456789
4 104 123456789
5 105 123456789

现在基于cellNumber我希望获取Person表中的所有这5条记录。 但很可能这个数字只在Person表中匹配,即

人员表

109 John 123456789 'john@gmail.com'

所以这次我想从Person表中获取记录

我上面写的查询解决了我的目的,但我想用Criteria构建器来完成 以下是Person和person_information on Entity level

之间的关系
public class Person {

@OneToOne(mappedBy = "person", optional = true, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private PersonalInformation personalInformation;

//getters and setters

}

public class PersonalInformation() {

@OneToOne(optional = false)
@JoinColumn(name = "personId", referencedColumnName = "id")
private Person person;
//getters and setters

}

使用条件构建器我可以执行以下任一操作,即根据cellNumber从Person表中获取记录,或者根据personal_information表中的cellNumber从Person表中获取记录

但我希望我已正确解释了我的问题,我想根据cellNumber从两个表中获取记录

提前致谢。如果有任何遗失的信息并且您希望我发布,请告诉我。

P.S。 我尝试过但没有用的东西:

List<Predicate> predicates = Lists.newArrayList();
predicates.add(criteriaBuilder.or(
                    criteriaBuilder.like(person.get(Person_.cellNumber), 123456789),
                    criteriaBuilder.like(person.get(Person_.personalInformation).<Integer>get("cellNumber"), 123456789)
               ));

我也试过单独使用它们。

predicates.add (criteriaBuilder.like(person.get(Person_.cellNumber), 123456789));
predicates.add (criteriaBuilder.like(person.get(Person_.personalInformation).<Integer>get("cellNumber"), 123456789))

0 个答案:

没有答案