【问题标题】:JPQL Query a list of Strings inside an EntityJPQL 查询实体内的字符串列表
【发布时间】:2015-09-12 04:54:07
【问题描述】:

我正在使用带有 GlassFish 4.1 Server 的 Java EE7 来构建一个系统,基本上您可以在其中发布想法,并且每个想法都可能有标签。 我已将实体 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后,我尝试通过以下方式通过Tag查找:

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 中选择ideatags 加入i.tagsideatags whereideatags.tags = :pTag]。 [61, 74] 状态字段路径 'ideatags.tags' 无法解析为有效类型。

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

【问题讨论】:

  • 您的情况与链接的帖子不同...您的列表是字符串,而不是可嵌入的。因此,您的 JPQL “ideatags.tags”完全没有意义。那么您是否要查找包含特定“标签”的所有 Idea 对象?
  • 哦,谢谢(我是 JEE 和 JPQL 的新手)。确切地说,我想获取包含该“标签”的所有 Idea 对象

标签: java jakarta-ee jpa jpql entities


【解决方案1】:

您的查询有一些问题:

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

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

你在ideatags中得到你的List标签,因此你不能得到ideatags的属性标签。

如果你想在列表中搜索,你必须使用 IN。

你可以试试这个:

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

【讨论】:

  • 好的,谢谢,有道理。但是我收到“语法错误解析 [select i from Idea i where :pTag IN i.tags]。[35, 35] IN 表达式中缺少左括号。[42, 42] 缺少右括号IN 表达式。”当我尝试这个时。你知道它可以是什么吗??
  • 我尝试像这样添加括号 (:pTag IN i.tags),但也没有用
  • 将括号放在“i.tags”周围(因为列表仅在 JPA 2.1 IIRC 中引入)。一些 JPA 实现在这方面很弱
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2013-04-23
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多