2017-11-26 1 views
0

Ich versuche, alle Artikel Datensätze durch Beitritt der Feeds-Tabelle und Filtern auf seine Source_id Feld ziehen.Frühling jpa onetomany Beziehung @Query funktioniert nicht

Mein Repository:

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

The Feed Modell:

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



} 

Der Artikel Modell:

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 + "]"; 
    } 


} 

Der Fehler Ich erhalte:

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] 

Ich habe versucht, OneToMany vorher zu kartieren, die mir den gleichen Fehler, hat jemand ein gutes Beispiel, wo dies angezeigt wird? Ich versuche nicht, feed_id zu filtern. Ich filtere Quell-ID, die ein Feld in der Feed-Tabelle ist.

Wesentlichen, was ich versuche zu erreichen ist nur abstrakt diese rohe SQL-Abfrage in Quellen und überwintert Art und Weise, Dinge zu tun:

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

Antwort

0

Nach einigem Tüfteln um es scheint ich mein Problem auf elegante Weise gelöst haben und eliminiert die Notwendigkeit, die Annotation @Query zu verwenden. Ich verdrahtete alle Beziehungen in allen 3 Modellen (Quelle, Feed und Artikel). OneToMany und ManyToOne konnten dann eine der von findBy * generierten Spring-Methoden verwenden und es funktioniert. Im Folgenden finden Sie alle geänderten Dateien, wenn Sie eine Referenz benötigen.

Source-Modell:

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

} 

-Feed Modell:

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



} 

Artikel Modell:

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 Datei

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