我正在将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)

09-13 07:22