简体   繁体   English

JPA查询语言中的IN和=运算符

[英]IN and = operator in JPA query language

I have a problem regarding jpa query. 我有关于jpa查询的问题。 There are two tables ie Post table and Tag table There is many to many relationship between Post and Tag 有两个表,即Post表和Tag表Post和Tag之间有很多关系

Now I want to write a query such that when multiple tags are chosen then all the posts associated with those tags should be selected. 现在我想编写一个查询,以便在选择多个标签时,应选择与这些标签关联的所有帖子。 For example, 例如,

post1 has tags friends and motivation
post2 has tags motivation and pune
post3 has tag boxing

if tags friends and pune are chosen then post1 and post 2 should be retrieved if tag boxing is chosen then only post 3 should be retrieved if tags boxing and motivation are chosen then all three posts should be retrieved. 如果选择标签friends和pune,则如果选择标签装箱则应检索post1和post2,那么如果选择标签装箱和动机则应检索第3位,则应检索所有三个位置。

I tried following things 我试过跟踪的事情

SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags IN :tags

but it gives validator error that 但它给出了验证器错误

The state field path 'p.tags' cannot be resolved to a collection type.

If I try like this 如果我这样试试

SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE p.tags = :tags

then it complies fine but after passing a list of tags it gives error 然后它符合要求但在传递标签列表后会出错

 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.

Thank you for reading this much :) can you please guide me on this? 感谢您阅读这篇文章:)请您指导我吗?

how can I achieve the results mentioned above? 我怎样才能达到上述结果? my persistence provider is eclipseLink 我的持久性提供程序是eclipseLink

This is Post entity 这是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 + "]";
}

}

This is Tag Entity 这是Tag Entity

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

}

Try: 尝试:

    ...
    @NamedQuery(name = "Post.selectPostsByTags", query =
       "SELECT DISTINCT p FROM Post p JOIN p.tags tags WHERE tags IN (:tags)") })
public class Post implements Serializable {
    ...

Use it like this: 像这样使用它:

@PersistenceContext
public EntityManager em;
...
List<Tag> ltags = new ArrayList<Tag>();
ltags.add(tagOne);
ltags.add(tagTwo);
List<?> list = em.createNamedQuery("Post.selectPostsByTags")
                                                    .setParameter("tags", ltags)
                                                    .getResultList();

for (Object object : list) {
    System.out.println("Results: "+object);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM