Spring Boot JPA-多个实体的自定义存储库

时间:2019-03-06 15:58:31

标签: rest spring-boot jpa repository

我的JPA Rest项目遇到一些困难。 我已经为我的每个实体(数据库中的表)构建了存储库,并且运行良好。 例如,我的实体“ Personne”的一部分:

@Entity
public class Personne {
private Long id;
private String nom;
private String prenom;
private Date dateNaissance;
private String telDomicile;
private String telPortable;
private String telAutre;
private String telCommentaire;
private String fax;
private String mail;
private String commentaire;
private Timestamp dateSuppr;
private String sexe;
private Patient patientById;
private Adresse adresseByAdresseId;

@Id
@JsonProperty(value = "dataId")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

}

还有带有@Query的myRepository:

@Transactional
@RepositoryRestResource(collectionResourceRel = "personne", path = "personne", excerptProjection = InlinePersonne.class)
public interface PersonneRepo extends JpaRepository<Personne, Long> {
@Query("from Personne p where p.nom = ?1 and p.prenom = ?2")
public Personne customRequest(String nom, String prenom);
}

我的问题:返回结果始终是“ Personne”类型。

我想发出一个本机请求,将带有自定义属性的对象发回给我。

希望返回的示例:

{object :
    {name : String,
    surname : String,
    age : int },
    adresse :{
        city : String,
        street : String
    }
}

有可能这样做吗? 我真的很需要它,因为我必须在许多表上进行复杂的请求。 谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用interface-base projections

首先,您需要创建反映所需字段的界面:

interface PersonSummary {

  String getName();
  String getSurename();
  int getAge();

  AddressSummary getAddress();

  interface AddressSummary {
    String getCity();
    String getStreet();
  }
}

然后,您指示您的自定义查询需要扩展和实例化哪个接口来填充信息:

public interface PersonneRepo extends JpaRepository<Personne, Long> {
    // All your other abstract method

    // Brand new query
    @Query("Select p.name, p.surname, p.age, p.city, p.street from Personne p where p.nom = ?1 and p.prenom = ?2")
    public PersonSummary customRequest(String nom, String prenom);
}

您将收到这样的对象:

{
  name : String,
  surname : String,
  age : int,
  address :{
    city : String,
    street : String
  }
}

您需要根据要接收的对象的组成复杂性来测试此功能的灵活性。