JPQL查询实体内的字符串列表

时间:2015-06-25 14:09:29

标签: java java-ee jpa jpql entities

我正在使用带有GlassFish 4.1服务器的Java EE7来构建一个基本上可以发布Ideas的系统,每个Idea可能都有标签。 我已将实体Idea声明为:

@Entity
@Table(name = "IDEAS")
public class Idea implements Serializable {

// Id, description, etc.

@ElementCollection
private List<String> tags;

// Getters, Setter, etc.
}

阅读JPA: Query an embeddable List inside an entity后,我试图通过以下方式找到标签:

public List<Idea> getIdeasWithTag(String tag) {
    String queryStr = "select ideatags from Idea i "
            + "inner join i.tags ideatags "
            + "where ideatags.tags = :pTag";
    Object res = em.createQuery(queryStr)
            .setParameter("pTag", tag)
            .getResultList();
    return (List<Idea>) res;
}

但是我收到了由:

引起的TransactionRolledbackLocalException
  

引起:java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:   例外描述:编译问题[从Idea i内部加入i.tags ideatags中选择ideatags,其中ideatags.tags =:pTag]。   [61,74]状态字段路径&#39; ideatags.tags&#39;无法解析为有效类型。

我感谢任何帮助,在此先感谢!!

2 个答案:

答案 0 :(得分:0)

您的查询存在一些问题:

select ideatags 
from Idea i inner join i.tags ideatags
where ideatags.tags = :pTag

您希望结果为Idea,但您选择了一个列表。

你在ideatags中得到了List标签,因此你无法获得ideatags的属性标签。

如果要在列表中搜索,则必须使用IN。

你可以试试这个:

select i
from Idea i
where :pTag IN (i.tags)

答案 1 :(得分:0)

试试这个:

select e from entity e WHERE :element in elements(e.listOfStrings)