【发布时间】:2014-07-13 23:46:36
【问题描述】:
为了从我的数据库中获取申请人的元素列表,我在尝试检索它们时遇到了问题。
我知道在这个例子中我正在通过一个错误的方法获取:获取实体的字符串 id,但这需要重构;)
这是我的规范和带有连接的谓词循环:
public static Specification<Applicant> applicantsMatchMobility(final String... mobilities) {
return new Specification<Applicant>() {
@Override
public Predicate toPredicate(Root<Applicant> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
Collection<Predicate> predicates = new ArrayList<>();
Join<Applicant, Mobility> applicantMobilityJoin = root.join("mobility");
for(String mobility : mobilities) {
predicates.add(builder.equal(applicantMobilityJoin.<Mobility>get("id"), Integer.parseInt(mobility)));
}
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
}
当我只传递 Mobility 实体的一个 id 时它工作正常,但当它是一个 String ids 数组 > 1 时,它总是返回 0..
这是我的junit测试:
@Test
public void ShouldHaveOneApplicantWhenSearchMobilityMultipleTotallyEquals(){
String mobilitiesId[] = {"0", "1"};
List<Applicant> applicantList = applicantRepository.findAll(applicantsMatchMobility(mobilitiesId));
Assert.assertNotNull(applicantList);
Assert.assertEquals("Result", 1, applicantList.size());
Applicant applicant = applicantList.get(0);
Assert.assertNotNull(applicant);
Assert.assertEquals("Result", "XBNC", applicant.getFirstName());
}
这是由此生成的请求:
select
*
from
applicant applicant0_
inner join
applicant_mobility mobility1_
on applicant0_.id=mobility1_.id_applicant
inner join
mobility mobility2_
on mobility1_.id_mobility=mobility2_.id
where
mobility2_.id=0
and mobility2_.id=1
这是我的测试数据集:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<MOBILITY ID="0" NAME="sud"/>
<MOBILITY ID="1" NAME="nice"/>
<MOBILITY ID="2" NAME="cannes"/>
<MOBILITY ID="3" NAME="nowhere"/>
<TAGS ID="0" NAME="tags1"/>
<TAGS ID="1" NAME="tags2"/>
<TAGS ID="2" NAME="tags3"/>
<STATUS ID="0" NAME="status1"/>
<STATUS ID="1" NAME="status2"/>
<AVAILABILITY ID="0" NAME="availability1"/>
<APPLICANT ID="0" LAST_NAME="XBNC" FIRST_NAME="XBNC" YEAR="2001" WAGE_CLAIM="50" ID_STATUS="0" ID_AVAILABILITY="0" />
<APPLICANT ID="1" LAST_NAME="XBN" FIRST_NAME="XBN" YEAR="0" WAGE_CLAIM="70" ID_STATUS="1" ID_AVAILABILITY="0"/>
<APPLICANT ID="2" LAST_NAME="MI" FIRST_NAME="MI" YEAR="1995" WAGE_CLAIM="0" ID_STATUS="1" ID_AVAILABILITY="0"/>
<APPLICANT ID="3" LAST_NAME="bisTronomique" FIRST_NAME="bisTronomique" YEAR="-400" WAGE_CLAIM="0" ID_STATUS="0" ID_AVAILABILITY="0"/>
<APPLICANT_MOBILITY ID_APPLICANT="0" ID_MOBILITY="0"/>
<APPLICANT_MOBILITY ID_APPLICANT="0" ID_MOBILITY="1"/>
<APPLICANT_MOBILITY ID_APPLICANT="1" ID_MOBILITY="0"/>
<APPLICANT_MOBILITY ID_APPLICANT="1" ID_MOBILITY="2"/>
<APPLICANT_MOBILITY ID_APPLICANT="2" ID_MOBILITY="1"/>
<APPLICANT_TAGS ID_APPLICANT="0" ID_TAGS="0"/>
<APPLICANT_TAGS ID_APPLICANT="0" ID_TAGS="1"/>
<APPLICANT_TAGS ID_APPLICANT="0" ID_TAGS="2"/>
</dataset>
你能在这个测试中看到我只需要取回“XBNC”申请人,因为他包含 2 个对应的 MobilityeID ..
【问题讨论】:
标签: java spring junit jpa-2.0 spring-data