我是一位有用的助手,可以为您翻译文本。
如果选择了标签“friends”和“pune”,则应检索“post1”和“post2” 如果选择了标签“boxing”,则只应检索“post3” 如果选择了标签“boxing”和“motivation”,则应检索全部三篇文章。
我尝试了以下方法。
但是它会产生验证器错误,提示如下:
然后它可以正常编译,但在传递标签列表后会出现错误。
感谢您阅读至此 :) 请问您可以指导我如何实现上述结果吗?我的持久性提供者是eclipseLink。这是“Post”实体。
这是标签实体。
我有一个关于JPA查询的问题。 有两个表,即帖子表和标签表, 在帖子和标签之间存在多对多的关系。
现在我想编写一个查询,当选择多个标签时,应选择与这些标签相关联的所有帖子。 例如,
post1 has tags friends and motivation
post2 has tags motivation and pune
post3 has tag boxing
如果选择了标签“friends”和“pune”,则应检索“post1”和“post2” 如果选择了标签“boxing”,则只应检索“post3” 如果选择了标签“boxing”和“motivation”,则应检索全部三篇文章。
我尝试了以下方法。
SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags IN :tags
但是它会产生验证器错误,提示如下:
The state field path 'p.tags' cannot be resolved to a collection type.
如果我像这样尝试
SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags = :tags
然后它可以正常编译,但在传递标签列表后会出现错误。
java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList for parameter tags with expected type of class com.justme.model.entities.Tag from query string SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags = :tags.
感谢您阅读至此 :) 请问您可以指导我如何实现上述结果吗?我的持久性提供者是eclipseLink。这是“Post”实体。
@Entity
@NamedQueries({
@NamedQuery(name = "Post.selectAllPosts", query = "SELECT p FROM Post p ORDER BY p.dateCreated DESC"),
@NamedQuery(name = "Post.selectPostForUser", query = "SELECT p FROM Post p WHERE p.user = :user ORDER BY p.dateCreated DESC"),
@NamedQuery(name = "Post.selectPostsByTags", query = "SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags IN :tags") })
public class Post implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idpost;
@Lob
private String content;
private String title;
// bi-directional many-to-one association to User
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "iduser")
private User user;
// bi-directional many-to-many association to Tag
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "post_tag", joinColumns = @JoinColumn(name = "idpost"), inverseJoinColumns = @JoinColumn(name = "idtag"))
private List<Tag> tags = new ArrayList<Tag>();
@Temporal(TemporalType.DATE)
private Date date = null;
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated = new Date();
public Post() {
}
public int getIdpost() {
return this.idpost;
}
public void setIdpost(int idpost) {
this.idpost = idpost;
}
public String getContent() {
return this.content;
}
public void setContent(String content) {
this.content = content;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
public List<Tag> getTags() {
return this.tags;
}
public void setTags(List<Tag> tags) {
this.tags = tags;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Date getDateCreated() {
return dateCreated;
}
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
@Override
public String toString() {
return "Post [idpost=" + idpost + ", content=" + content + ", title="
+ title + ", date=" + date + "]";
}
}
这是标签实体。
@Entity
@NamedQueries({
@NamedQuery(name = "Tag.selectTags", query = "SELECT tag FROM Tag tag WHERE tag.tagName LIKE :keyword"),
@NamedQuery(name = "Tag.selectMatchingTags", query = "SELECT t.tagName FROM Tag t WHERE t.tagName LIKE :keyword"),
@NamedQuery(name = "Tag.selectTagByName", query = "SELECT tag FROM Tag tag WHERE tag.tagName = :tagName"),
@NamedQuery(name = "Tag.selectTagsForAllPosts", query = "SELECT DISTINCT tag FROM Tag tag, Post post JOIN tag.posts posts WHERE post.user = :user")})
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idtag;
private String tagName;
// bi-directional many-to-many association to Post
@ManyToMany(mappedBy = "tags", cascade = CascadeType.PERSIST)
private List<Post> posts;
public Tag() {
}
public Tag(String tagName) {
this.tagName = tagName;
}
public int getIdtag() {
return this.idtag;
}
public void setIdtag(int idtag) {
this.idtag = idtag;
}
public String getTagName() {
return this.tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public List<Post> getPosts() {
return this.posts;
}
public void setPosts(List<Post> posts) {
this.posts = posts;
}
@Override
public String toString() {
return tagName;
}
}
SELECT DISTINCT p FROM Post p WHERE p.tags IN :tags
。 - kostja