gpt4 book ai didi

java - spring jpa onetomany关系@Query不起作用

转载 作者:行者123 更新时间:2023-12-02 11:57:25 25 4
gpt4 key购买 nike

我试图通过加入 feed 表并过滤它的 source_id 字段来提取所有文章记录。

我的存储库:

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

Feed 模型:

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,它是 feed 表上的一个字段。

本质上,我想要实现的只是将这个原始 sql 查询抽象为 spring 和 hibernates 的做事方式:

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

最佳答案

经过一些修改后,我似乎已经以一种优雅的方式解决了我的问题,并且消除了使用 @Query 注释的需要。我连接了所有 3 个模型(来源、提要和文章)中的所有关系。 OneToMany 和 ManyToOne,然后能够使用 findBy* 生成的 spring 方法之一并且它可以工作。以下是所有修改后的文件,有需要的 friend 可以引用一下。

源模型:

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;

}

文章存储库文件

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

关于java - spring jpa onetomany关系@Query不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47501696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com