我正在将Java EE7与GlassFish 4.1服务器一起使用,以构建一个基本上可以在其中发布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内部连接中选择ideatag,然后在i.tags ideatags中选择ideatags.tags =:pTag)。
[61,74]状态字段路径'ideatags.tags'无法解析为有效类型。
感谢您的帮助,谢谢!!
最佳答案
您的查询有一些问题:
select ideatags
from Idea i inner join i.tags ideatags
where ideatags.tags = :pTag
您希望结果为Idea,但选择一个List。
您在Ideatags中获得了List标签,因此无法获得ideatags的属性标签。
如果要在列表中搜索,则必须使用IN。
您可以尝试以下方法:
select i
from Idea i
where :pTag IN (i.tags)