2017-11-26 9 views
0

피드 테이블에 가입하고 source_id 필드에서 필터링하여 모든 기사 레코드를 가져 오려고합니다.spring jpa onetomany relationship @Query not working

내 저장소 :

package com.infostream.repositories; 

import org.springframework.data.domain.Page; 
import org.springframework.data.domain.Pageable; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.PagingAndSortingRepository; 

import com.infostream.models.Article; 
import java.lang.String; 

public interface ArticleRepositoryImpl extends PagingAndSortingRepository<Article, Long> { 
    Page<Article> findAll(Pageable pageRequest); 

    Page<Article> findByFeedId(String feedId, Pageable pageable); 

    @Query("select a from Article a join Feed f where f.source_id = ?1"); 
    Page<Article> findBySourceId(String sourceId, Pageable pageable); 
} 

공급 모델 :

package com.infostream.models; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import com.infostream.serializers.JsonDateSerializer; 

@Entity 
@Table(name="feeds") 
public class Feed extends Base { 

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

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

    @NotNull 
    @Column(columnDefinition="text") 
    private String url; 

    @Column(name = "last_visited") 
    private Date lastVisited; 

    public Feed() { 
    } 

    public Feed(String sourceId, String categoryId, String url) { 
     this.sourceId = sourceId; 
     this.categoryId = categoryId; 
     this.url = url; 
    } 

    @JsonSerialize(using = JsonDateSerializer.class) 
    public Date getLastVisited() { 
     return lastVisited; 
    } 

    public void setLastVisited(Date lastVisited) { 
     this.lastVisited = lastVisited; 
    } 

    public String getSourceId() { 
     return sourceId; 
    } 

    public void setSourceId(String sourceId) { 
     this.sourceId = sourceId; 
    } 

    public String getCategoryId() { 
     return categoryId; 
    } 

    public void setCategoryId(String categoryId) { 
     this.categoryId = categoryId; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 



} 

문서 모델 :

package com.infostream.models; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

@Entity 
@Table(name = "articles") 
public class Article extends Base { 

    public Article() { 

    } 

    public Article(String feedId, String title, String description, String url) { 
     this.feedId = feedId; 
     this.title = title; 
     this.description = description; 
     this.url = url; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public String getImgUrl() { 
     return imgUrl; 
    } 

    public void setImgUrl(String imgUrl) { 
     this.imgUrl = imgUrl; 
    } 

    public String getFeedId() { 
     return feedId; 
    } 

    public void setFeedId(String feedId) { 
     this.feedId = feedId; 
    } 

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

    @NotNull 
    @Column(columnDefinition="text") 
    private String title; 

    @Column(name = "img_url", columnDefinition="text") 
    private String imgUrl; 

    @Column(columnDefinition="text") 
    private String description; 

    @NotNull 
    @Column(columnDefinition="text") 
    private String url; 

    @Override 
    public String toString() { 
     return "Article [feedId=" + feedId + ", title=" + title + ", imgUrl=" + imgUrl + ", description=" + description 
       + ", url=" + url + "]"; 
    } 


} 

오류 난 점점 오전 :

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select a from com.infostream.models.Article a join Feed f where f.source_id = ?1] 

OneToMany 매핑 오류가 발생하기 전에 동일한 오류가 발생했습니다. 아무도 좋은 예가 표시되어 있습니까? feed_id를 필터링하려고하지 않습니다. 피드 테이블의 필드 인 source_id에서 필터링 중입니다.

기본적으로 무엇을 달성하려고하는 것은 봄에이 원시 SQL 쿼리는 단순히 추상적이고, 일을 가지 방법으로 최대 절전 모드 : 그것은 내가 우아한 방법으로 내 문제를 해결 한 나타납니다 주위에 약간의 땜질 후

select a.* from articles as a join feeds as f on(a.feed_id = f.id) where f.source_id = 'some_source_id'; 

답변

0

을 @Query 어노테이션을 사용할 필요가 없어졌다. 나는 모든 3 가지 모델 (출처, 피드 및 조항)의 모든 관계를 연결했습니다. OneToMany 및 ManyToOne을 사용하여 findBy * 생성 된 스프링 메서드 중 하나를 사용할 수있었습니다. 누구나 참조해야하는 경우 수정 된 파일은 다음과 같습니다.

소스 모델 :

package com.infostream.models; 

import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

import org.hibernate.validator.constraints.NotEmpty; 

@Entity 
@Table(name="sources") 
public class Source extends Base { 

    @NotNull 
    @NotEmpty 
    private String name; 

    @OneToMany(mappedBy = "source", cascade = CascadeType.ALL) 
    private Set<Feed> feeds; 

    public String getName() { 
     return name; 
    } 

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

    public Source() { 

    } 

    public Source(String name) { 
     this.name = name; 
    } 

} 

공급 모델 :

package com.infostream.models; 

import java.util.Date; 
import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import com.infostream.serializers.JsonDateSerializer; 

@Entity 
@Table(name="feeds") 
public class Feed extends Base { 

    @ManyToOne 
    @JoinColumn(name = "source_id", nullable = false) 
    private Source source; 


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

    @NotNull 
    @Column(columnDefinition="text") 
    private String url; 

    @Column(name = "last_visited") 
    private Date lastVisited; 

    @OneToMany(mappedBy = "feed", cascade = CascadeType.ALL) 
    private Set<Article> articles; 

    public Feed() { 
    } 

    public Feed(Source source, String categoryId, String url) { 
     this.source = source; 
     this.categoryId = categoryId; 
     this.url = url; 
    } 

    @JsonSerialize(using = JsonDateSerializer.class) 
    public Date getLastVisited() { 
     return lastVisited; 
    } 

    public void setLastVisited(Date lastVisited) { 
     this.lastVisited = lastVisited; 
    } 

    public String getCategoryId() { 
     return categoryId; 
    } 

    public void setCategoryId(String categoryId) { 
     this.categoryId = categoryId; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 



} 

제 모델 :

package com.infostream.models; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

@Entity 
@Table(name = "articles") 
public class Article extends Base { 

    public Article() { 

    } 

    public Article(Feed feed, String title, String description, String url) { 
     this.feed = feed; 
     this.title = title; 
     this.description = description; 
     this.url = url; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public String getImgUrl() { 
     return imgUrl; 
    } 

    public void setImgUrl(String imgUrl) { 
     this.imgUrl = imgUrl; 
    } 

    @ManyToOne 
    @JoinColumn(name = "feed_id", nullable = false) 
    private Feed feed; 

    @NotNull 
    @Column(columnDefinition="text") 
    private String title; 

    @Column(name = "img_url", columnDefinition="text") 
    private String imgUrl; 

    @Column(columnDefinition="text") 
    private String description; 

    @NotNull 
    @Column(columnDefinition="text") 
    private String url; 

} 

ArticleRepository 파일

package com.infostream.repositories; 

import org.springframework.data.domain.Page; 
import org.springframework.data.domain.Pageable; 
import org.springframework.data.repository.PagingAndSortingRepository; 

import com.infostream.models.Article; 
import java.lang.String; 

public interface ArticleRepositoryImpl extends PagingAndSortingRepository<Article, Long> { 
    Page<Article> findAll(Pageable pageRequest); 

    Page<Article> findByFeedId(String feedId, Pageable pageable); 

    Page<Article> findByFeed_sourceId(String sourceId, Pageable pageable); 
}