2017-12-27 2543 views
0

说明如何使用JpaRepository和嵌套的对象列表进行搜索?

有一个PersonRepositoryPerson实体, Person类包含List<Qualification>Qualification类有3个简单的字段。

我尝试添加自定义方法@Query注释和使用JPQL得到的结果,但Qualification类领域是不可用于操纵JPQL因为库本身包含List<Qualification>代替的Qualification只是一个简单的领域。

如何通过这些Qualification的嵌套字段进行搜索?

查询

现在我需要找人实体的列表,其中合格的experienceInMonths大于3小于9和资格的名字字段='Java的。

代码

Person.java

@Data 
@Entity 
public class Person { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private String id; 

@NotEmpty 
@Size(min = 2) 
private String name; 

@NotEmpty 
@Size(min = 2) 
private String surname; 

@ElementCollection(targetClass = java.util.ArrayList.class, fetch = FetchType.EAGER) 
private List<Qualification> qualifications = new ArrayList<>(); 

} 

PersonRepository.java

@Repository 
public interface PersonRepository extends JpaRepository<Person, String> { 
} 

Qualification.java

@Data 
@AllArgsConstructor 
public class Qualification implements Serializable { 

    @Id @GeneratedValue 
    private String id; 
    private String name; 
    private String experienceInMonths; 
} 

编辑:不重复的this post,因为这里是嵌套对象的集合。不只是单一的参考。

+0

的可能的复制[春季数据JPA找到嵌入对象的属性(HTTPS ://stackoverflow.com/questions/24441411/spring-data-jpa-find-by-embedded-object-property) –

+0

正如在编辑帖子中提到的,这个问题并没有相应的提出答案。正如你可以在粘贴的代码中看到的那样,对象的'List'有一个问题 - 不仅仅是其中的一个。 – DevDio

回答

1

首先,将experienceInMonthsString更改为int(否则您无法将该字符串与数字进行比较)。然后,你可以尝试使用这个“香肠”:

List<Person> findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndName(int experienceGreater, int experienceLess, String name); 

或者你可以尝试使用这种相当不错的方法:

@Query("select p from Person p left join p.qualifications q where q.experienceInMonths > ?1 and q.experienceInMonths < ?2 and q.name = ?3") 
List<Person> findByQualification(int experienceGreater, int experienceLess, String name); 
+0

是否在当地为您工作? JPQL版本给了我'org.hibernate.QueryException:不能解引用标量集合元素:'和香肠之一:'引起:java.lang.IllegalStateException:非法尝试解引用基本类型的路径源[null]。即使将Qualification#experienceInMonths类型更改为'int' – DevDio

+0

@DevDio尝试将'@ Entity'添加到'Qualification'并将'@ ElementCollection'替换为'@ OneToMany'(类似的变体适用于我...) – Cepr0

+0

好的,终于搞定了,但它需要在Hibernate中实现单独的'Qualification'表。其中包含FK给Person(@Entity,@ManyToOne附加字段)+ QualificationRepository是强制性的。 还测试了建议的方法,JPQL的版本工作正常,但'香肠'的名称需要调整为: 'findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndQualifications_Name'。 否则会搜索人名。非常感谢@ Cepr0的帮助! – DevDio