2017-04-22 100 views
1

我創建與實體JHipster單片應用程序設置:配置文件,以下&航程導致下面的模式:檢索表聯接的結果從我的REST API

Schema

  • 我通過添加PROFILE實體來擴展JHI_USER。
  • 每個用戶可以關注零個或多個其他用戶(後續)。
  • 用戶具有零次或多個航行(VOYAGES)

在我的web應用程序角度我想顯示爲用戶特定用戶跟隨航行的列表。下面的SQL查詢會給我需要的結果集:

SELECT PROFILE.HANDLE, VOYAGE.NAME 
FROM PROFILE, VOYAGE, FOLLOWING 
WHERE FOLLOWING.USER_ID = 4 
AND VOYAGE.USER_ID = PROFILE.USER_ID 
AND PROFILE.USER_ID = FOLLOWING.FOLLOWING_ID 

什麼是創造我的JHipster應用程序中的REST端點,返回這個結果集所需的步驟?

我需要做以下幾點嗎?

  • 創建結果的新的實體類設置
  • 創建執行查詢
  • 建立在我的控制器端點調用庫檢索結果作爲我的實體列表的新庫類

我是Spring JPA的新手,一直在努力實現它。

===更新===

下面是我的項目的實體類:

的 '個人資料' 實體:

/** 
* A Profile. 
*/ 
@Entity 
@Table(name = "profile") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Profile implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") 
    @SequenceGenerator(name = "sequenceGenerator") 
    private Long id; 

    @NotNull 
    @Column(name = "handle", nullable = false) 
    private String handle; 

    @Column(name = "bio") 
    private String bio; 

    @OneToOne 
    @JoinColumn(unique = true) 
    private User user; 

    public Long getId() { 
     return id; 
    } 

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

    public String getHandle() { 
     return handle; 
    } 

    public Profile handle(String handle) { 
     this.handle = handle; 
     return this; 
    } 

    public void setHandle(String handle) { 
     this.handle = handle; 
    } 

    public String getBio() { 
     return bio; 
    } 

    public Profile bio(String bio) { 
     this.bio = bio; 
     return this; 
    } 

    public void setBio(String bio) { 
     this.bio = bio; 
    } 

    public User getUser() { 
     return user; 
    } 

    public Profile user(User user) { 
     this.user = user; 
     return this; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 
     Profile profile = (Profile) o; 
     if (profile.id == null || id == null) { 
      return false; 
     } 
     return Objects.equals(id, profile.id); 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hashCode(id); 
    } 

    @Override 
    public String toString() { 
     return "Profile{" + 
      "id=" + id + 
      ", handle='" + handle + "'" + 
      ", bio='" + bio + "'" + 
      '}'; 
    } 
} 

的 '關注對象' 實體:

/** * A以下。 */ @Entity @Table(name = 「下面」) @Cache(使用率= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 公共類繼實現Serializable {

private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") 
    @SequenceGenerator(name = "sequenceGenerator") 
    private Long id; 

    @OneToOne 
    @JoinColumn(unique = true) 
    private User following; 

    @ManyToOne 
    private User user; 

    public Long getId() { 
     return id; 
    } 

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

    public User getFollowing() { 
     return following; 
    } 

    public Following following(User user) { 
     this.following = user; 
     return this; 
    } 

    public void setFollowing(User user) { 
     this.following = user; 
    } 

    public User getUser() { 
     return user; 
    } 

    public Following user(User user) { 
     this.user = user; 
     return this; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 
     Following following = (Following) o; 
     if (following.id == null || id == null) { 
      return false; 
     } 
     return Objects.equals(id, following.id); 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hashCode(id); 
    } 

    @Override 
    public String toString() { 
     return "Following{" + 
      "id=" + id + 
      '}'; 
    } 
} 

的 '航程' 實體:

/** 
* A Voyage. 
*/ 
@Entity 
@Table(name = "voyage") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Voyage implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") 
    @SequenceGenerator(name = "sequenceGenerator") 
    private Long id; 

    @NotNull 
    @Column(name = "name", nullable = false) 
    private String name; 

    @NotNull 
    @Column(name = "start_date", nullable = false) 
    private ZonedDateTime startDate; 

    @Column(name = "distance") 
    private Integer distance; 

    @ManyToOne 
    private User user; 

    public Long getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

    public Voyage name(String name) { 
     this.name = name; 
     return this; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public ZonedDateTime getStartDate() { 
     return startDate; 
    } 

    public Voyage startDate(ZonedDateTime startDate) { 
     this.startDate = startDate; 
     return this; 
    } 

    public void setStartDate(ZonedDateTime startDate) { 
     this.startDate = startDate; 
    } 

    public Integer getDistance() { 
     return distance; 
    } 

    public Voyage distance(Integer distance) { 
     this.distance = distance; 
     return this; 
    } 

    public void setDistance(Integer distance) { 
     this.distance = distance; 
    } 

    public User getUser() { 
     return user; 
    } 

    public Voyage user(User user) { 
     this.user = user; 
     return this; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 
     Voyage voyage = (Voyage) o; 
     if (voyage.id == null || id == null) { 
      return false; 
     } 
     return Objects.equals(id, voyage.id); 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hashCode(id); 
    } 

    @Override 
    public String toString() { 
     return "Voyage{" + 
      "id=" + id + 
      ", name='" + name + "'" + 
      ", startDate='" + startDate + "'" + 
      ", distance='" + distance + "'" + 
      '}'; 
    } 
} 
+0

你是怎麼添加你的實體的?手動或通過使用發生器?如果你使用生成器所有f你提到的那些東西是爲你自動生成的實體類,存儲庫,服務,休息端點和角crud界面 – ketrox

+0

我使用了生成器。我想運行的查詢不會直接映射到任何現有實體,因爲它是多個表的連接,並且返回的結果集中包含Profile&Voyage實體的列。 – Mook5ter

+0

所以我從你的評論中瞭解到,這不是Jhipster相關的,而是彈簧數據。你應該閱讀https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods併發布具體的實體類,如果你需要幫助創建查詢,因爲它很難回答你的問題只是從UML – ketrox

回答

1

按照您在評論中的建議修改您的架構後,您需要添加2個查詢:

1.VoyageRepository:

List<Voyage> findByProfileIn(Collection<Profile> profiles); 

2。ProfileRepository

List<Profile> findByFollowingID(long Id); 

然後在你的航程服務相結合的2個查詢:

return voyageRepository.findByProfileIn(profileRepository.findbyFollowingId(id)); 

,然後暴露在你的VoyageRessource。

+0

我修改了Schema,但是我得到了'PropertyReferenceException:沒有找到屬性類型Profile的ID!在添加'List findByFollowingID(long Id);'到ProfileRepository之後,您的意思是'followings'?這是因爲Profile&Following(一對多)之間的關係是單向的嗎? – Mook5ter

0

我得到這個工作的:

1.Modifying的架構中,以便「個人資料」與「關注對象」 &一到,許多 關係「航程」,即去除JHI_USER &之間的關係 '繼' 和 '遠航'

2.Defining內VoyageRepository以下查詢

public interface VoyageRepository extends JpaRepository<Voyage,Long> { 
    @Query("select v.name, v.profile.handle from Voyage v, Following f where f.profile.user.id = 4 and f.following.id = v.profile.id") 

    List<Voyage> getFeed(); 
} 

我硬編碼的id值(4)我n上面的代碼,因爲我還沒有弄清楚如何將參數傳遞給查詢。 JPA是心靈彎曲!

+0

'@Query(「從voyage v選擇v.name,v.profile.handle,在f以下f.profile.user.id =:id和f.following.id = v.profile.id」)列表 getFeed (@Param(id)long id);' –

+0

That works,perfect ..謝謝 – Mook5ter

+0

很高興幫助。 –