2013-04-25 5 views
5

मुझे जेपीए क्वेरी के बारे में कोई समस्या है। दो टेबल हैं यानी पोस्ट टेबल और टैग टेबल पोस्ट और टैगजेपीए क्वेरी भाषा में IN और = ऑपरेटर

अब मैं एक प्रश्न लिखना चाहता हूं कि जब कई टैग चुने जाते हैं तो उन टैग से जुड़े सभी पोस्ट होना चाहिए चयनित। टैग मित्रों और पुणे तो post1 चुना है और पोस्ट 2 रहे उदाहरण के लिए,

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

अगर पुनः प्राप्त किया जा चाहिए, अगर टैग मुक्केबाजी चुना जाता है तो केवल 3 पोस्ट पुनः प्राप्त किया जा चाहिए, अगर टैग मुक्केबाजी और प्रेरणा तो सभी तीन चुना जाता है पदों को पुनर्प्राप्त किया जाना चाहिए।

मैं चीजों

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

यह वह जगह है पोस्ट इकाई

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

} 
+0

क्या आप अपनी पोस्ट इकाई का कोड पोस्ट कर सकते हैं? ऐसा लगता है कि समस्या – kostja

+0

@kostja आपके सुझावों के अनुसार इकाई कोड जोड़ा जा सकता है। और आप देख सकते हैं कि NamedQuery Tag.selectTagForAllPosts जो उपयोगकर्ता के लिए सभी टैग पुनर्प्राप्त करता है ठीक काम करता है। मुझे लगता है कि पदों से टैग पुनर्प्राप्त करना भी इसी तरह होना चाहिए कि मैंने चीज़ से ऊपर क्यों प्रयास किया लेकिन यह –

+0

काम नहीं करता है। मुझे लगता है कि यह सरलीकृत संस्करण काम कर सकता है: 'पोस्ट पी से DISTINCT पी चुनें जहां p.tags इन: टैग्स – kostja

उत्तर

7

कोशिश है:

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

इस तरह यह प्रयोग करें:

@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); 
} 
+0

असल में मैं getNamedQuery विधि को खोजने में सक्षम नहीं हूं, और मुझे लगता है कि आप जिस सत्र ऑब्जेक्ट का जिक्र कर रहे हैं वह EntityManager प्रकार का है। इसके अलावा, मुझे createNamedQuery पर setParameterList विधि नहीं मिल सका। क्या मैं सही हूं या क्या मैं कुछ गलत कर रहा हूं? –

+0

असल में, 'सेट पैरामीटर लिस्ट' हाइबरनेट पर काम करता है। मैंने जवाब संपादित किया। उम्मीद के रूप में काम करना चाहिए (Eclipselink में) अब। – acdcjunior

+1

अरे आदमी ... वह एक बड़ी मदद थी। इसने काम कर दिया। वास्तव में मुझे अभी भी IN: टैग के साथ IN (: टैग) को प्रतिस्थापित करना पड़ा था। मुझे समझ में नहीं आता कि यह समस्या क्यों पैदा करता है। इसके अलावा, टैग के बजाय WHERE क्लॉज में p.tags लिखने में मैं गलत था। क्या आप कृपया मुझे समझा सकते हैं कि क्या अंतर है? क्या आप कृपया एक अच्छा ट्यूटोरियल सुझा सकते हैं जो जेपीए क्वेरी भाषा वाक्यविन्यास को बहुत अच्छी तरह से बताता है :) सहायता के लिए धन्यवाद। जैसे ही मैं योग्य बनता हूं, मैं वोट दूंगा –

संबंधित मुद्दे