2017-11-26 7 views
0

私はfeedsテーブルに加わり、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; 
    } 



} 

Articleモデル:

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でフィルタリングしようとしていません。 feedsテーブルのフィールドである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 *生成されたスプリングメソッドの1つを使用することができました。以下は、誰かが参照する必要がある場合はすべての変更されたファイルです。

ソースモデル:

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; 
    } 



} 

Articleモデル:

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); 
}