我正在使用带有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;无法解析为有效类型。
我感谢任何帮助,在此先感谢!!
答案 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)