2013-04-25 18 views
5

Jpa sorgusuyla ilgili bir sorunum var. iki tabloIN ve = JPA sorgu dilindeki işleç

Şimdi birden etiketler bu etiketlerin ilişkili sonra tüm mesajlarını seçilirken olmalıdır, öyle ki bir sorgu yazmak istiyorum Orada Mesaj masa ve Etiket tablo birçok mesaj arasındaki ilişki ve Etiketi için birçok yoktur yani vardır seçilen. etiketler boks ve motivasyon sonra her üç seçilir eğer etiketleri arkadaşları ve pune sonra post1 seçilmiş ve 2 postalamak Örneğin ,

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

eğer etiket boks seçilirse o zaman sadece yayın 3 alınması gerekir alınması gerekir mesajlar alınmalıdır.

Ben şeyler

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

ama bu

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

gibi çalışırsanız

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

sonra ince uymasını doğrulayıcı hata veriyor aşağıdaki ancak bir listesini geçtikten sonra çalıştı etiketler, hata veriyor

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. 

Bu kadarını okuduğunuz için teşekkür ederim :) bana bu konuda yol gösterebilir misiniz?

Yukarıda belirtilen sonuçlara nasıl ulaşabilirim? benim kalıcılık sağlayıcısı

Bu EclipseLink

olan Mesaj varlık

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

} 

olan bu Etiket varlık

@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

Posta kodunuzun kodunu postalayabilir misiniz? Görünüşe göre bu konuyla ilgili olarak – kostja

+0

Kostja Eklenmiş varlık kodu olabilir. ve kullanıcı için tüm etiketleri alan NamedQuery Tag.selectTagForAllPosts'ın gayet iyi çalıştığını fark edebilirsiniz. Ben yazılardan etiketler almayı da düşünmeliyim, bu yüzden aynı şey üzerinde çalıştım ama işe yaramadı –

+0

Bence bu basitleştirilmiş sürüm işe yarayabilir: '' SEÇENEKLERİNİ SEÇİN PERSONEL PERSONERLER IN: Etiketler ' – kostja

cevap

7

deneyin geçerli:

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

böyle kullanın:

@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

aslında getNamedQuery yöntemini bulamıyorum ve inanıyorum oturum nesnesi EntityManager türünde olduğunu varsayalım. Ayrıca, createNamedQuery'de setParameterList yöntemini bulamadım. Haklı mıyım yoksa çok yanlış bir şey mi yapıyorum? –

+0

Aslında, "setParameterList", Hazırda Bekleme durumunda çalışıyor. Cevabı ben düzenledim. Beklendiği gibi çalışmalı (Eclipselink'te). – acdcjunior

+1

hey adam ... bu çok yardımcı oldu. İşe yaradı. aslında IN: etiketlerini IN:() ile değiştirmeniz gerekiyordu. Niçin sorunlara neden olduğunu anlamıyorum. Ayrıca, etiket yerine WHERE deyiminde p.tags yazarken yanılmışım. Lütfen farkın ne olduğunu açıklayabilir misiniz? Lütfen JPA sorgu dili sözdizimini çok iyi açıklayan iyi bir öğretici önerebilir misiniz? Yardımlarınız için teşekkürler. Uygun duruma gelir gelmez oy vereceğim –