lbd*_*d01 5 java jpa projection one-to-many spring-data
我有一个具有一个托凡关系(ContactInfo)的JPA实体(人)。
@Entity
public class Person {
@Id
@GeneratedValue
private Integer id;
private String name;
private String lastname;
private String sshKey;
@OneToMany(mappedBy = "personId")
private List<ContactInfo> contactInfoList;
}
@Entity
public class ContactInfo {
@Id
@GeneratedValue
private Integer id;
private Integer personId;
private String description;
}
Run Code Online (Sandbox Code Playgroud)
我已经定义了一个投影接口,其中包括这里描述的这种千丝万缕的关系。
public interface PersonProjection {
Integer getId();
String getName();
String getLastname();
List<ContactInfo> getContactInfoList();
}
public interface PersonRepository extends JpaRepository<Person,Integer> {
List<PersonProjection> findAllProjectedBy();
}
Run Code Online (Sandbox Code Playgroud)
当我使用findAllProjectedBy检索数据时,结果包含太多行。看起来返回的数据是联接查询的结果,类似于:
select p.id, p.name, p.lastname, ci.id, ci.person_id, ci.description
from person p
join contact_info ci on ci.person_id = p.id
Run Code Online (Sandbox Code Playgroud)
例如,此数据集:
insert into person (id,name,lastname,ssh_key) values (1,'John','Wayne','SSH:KEY');
insert into contact_info (id, person_id, description) values (1,1,'+1 123 123 123'), (2,1,'john.wayne@west.com');
Run Code Online (Sandbox Code Playgroud)
该findAllProjectedBy方法返回2个对象(不正确)和标准的findAll返回1个对象(正确地)。
完整的项目在这里
我已经进行了一些调试,看来问题出在jpa查询上。findAll方法使用以下查询:
select generatedAlias0 from Person as generatedAlias0
Run Code Online (Sandbox Code Playgroud)
findAllProjectedBy使用以下查询:
select contactInfoList, generatedAlias0.id, generatedAlias0.name, generatedAlias0.lastname from Person as generatedAlias0
left join generatedAlias0.contactInfoList as contactInfoList
Run Code Online (Sandbox Code Playgroud)
有人知道如何解决这种无效行为吗?
这里描述了此问题的快速修复:https : //jira.spring.io/browse/DATAJPA-1173
您需要使用@Value注释描述单个投影属性之一。对于上面发布的示例,您将得到以下结果:
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
public interface PersonProjection {
@Value("#{target.id}")
Integer getId();
String getName();
String getLastname();
List<ContactInfo> getContactInfoList();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4220 次 |
| 最近记录: |