EclipseLink-6015 表达式中的查询键 [客户] 无效
Posted
技术标签:
【中文标题】EclipseLink-6015 表达式中的查询键 [客户] 无效【英文标题】:EclipseLink-6015 Invalid query key [customer] in expression 【发布时间】:2014-04-09 14:54:38 【问题描述】:我需要得到的都是Event
s,其中CustomerEvent.customer.id = 123
。我实际上得到的是例外。
仅包含相关成员的简化实体:
@Table(name = "EVENT")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 1)
public abstract class Event
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(nullable = false)
private Integer id;
@Entity
@DiscriminatorValue("C")
public class CustomerEvent extends Event
@ManyToOne(optional = false)
private Customer customer;
@Entity
@Table(name = "CUSTOMER")
public class Customer
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(nullable = false)
private Integer id;
查询:
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Event> cq = cb.createQuery(Event.class);
final Root<Event> root = cq.from(Event.class);
cq.select(root);
cq.where(cb.equal(((Root<CustomerEvent>) root.as(CustomerEvent.class)).get(CustomerEvent_.customer).get(Customer_.id), 123));
// this predicate doesn't work either: cb.isNotNull(((Root<CustomerEvent>) root.as(CustomerEvent.class)).get(CustomerEvent_.customer));
em.createQuery(cq).getResultList(); // throws exception
例外:
Exception [EclipseLink-6015] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [customer] in expression.
Query: ReadAllQuery(referenceClass=Event )
at org.eclipse.persistence.exceptions.QueryException.invalidQueryKeyInExpression(QueryException.java:691)
【问题讨论】:
【参考方案1】:如果您使用的是 root.as(CustomerEvent.class),为什么不直接查询 CustomerEvent?只有 CustomerEvent 实例可以有 CustomerEvent.customer.id = 123 或者你不需要使用'as'函数。
'As' 已被弃用,而应使用 JPA 的 Treat 谓词(包含在 EclipseLink 2.5.1 中) - 不同之处在于,treat 将排除该谓词中的 non-customerEvent 实例,而 'as' 仅强制转换谓词,因此更难使用且不稳定。 Treat 允许您安全地使用更复杂的表达式,例如 "从 Event 事件中选择事件 where (treat(event as CustomerEvent).customer.id = 123) 或 event.somethingelse = someotherCondition"
【讨论】:
谢谢,cb.treat()
解决了我的问题!回答你的问题 - 我不能直接使用 CustomerEvent
有两个原因:1. cq.from(Event.class)
内置在父抽象类中,我将它内联到测试用例中只是为了简化 2. 我还有其他条件操作 @987654325 @直接在cb.or(...)
还有一点需要注意 - 我遇到了bugs.eclipse.org/bugs/show_bug.cgi?id=410406 中描述的问题。将 Glassfish 4.0 中的 EclipseLink 从捆绑的 2.5.0 升级到 2.5.1 修复了它。以上是关于EclipseLink-6015 表达式中的查询键 [客户] 无效的主要内容,如果未能解决你的问题,请参考以下文章