Java EE NamedQuery 和 JOIN 语句 - 导致 EJB 异常

Posted

技术标签:

【中文标题】Java EE NamedQuery 和 JOIN 语句 - 导致 EJB 异常【英文标题】:Java EE NamedQuery and JOIN statement - results in EJB Exception 【发布时间】:2013-03-15 12:38:05 【问题描述】:

我有一个名为很多的实体,如下所示:

public class Lots implements Serializable 

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int lotId;

@ManyToOne
private Boats boats;

private int numCrates;

....

而且我还有一个实体叫 Boats:

public class Boats implements Serializable 

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int boatId;

@ManyToOne
private Users user;

private String name;

我正在尝试在很多上创建一个命名查询,如下所示:

@NamedQueries(
@NamedQuery(name = "FindUsersByLot", query = "SELECT b FROM Lots b JOIN Boats a ON     (b.boats.boatId = a.boatId) WHERE a.user = :user")    
)

但这会导致 EJB 异常。

如何在命名查询中进行 JOIN?

【问题讨论】:

【参考方案1】:

首先,当您询问为什么会出现异常时,请发布堆栈跟踪。但是,我认为问题在于,当您应该考虑 JPQL 时,您仍在考虑 SQL。试试这个:

@NamedQuery(name = "FindUsersByLot", query = "SELECT b FROM Lots b JOIN b.boats a WHERE a.user = :user")

解释 - 您假设每个 Lots 记录将包含一个 boatId 列,这可能是也可能不是这种情况。在@ManyToOne 中,JPA 提供者可能会选择将关系存储在Boats 端。至于我为什么要这样写查询,看this。

【讨论】:

以上是关于Java EE NamedQuery 和 JOIN 语句 - 导致 EJB 异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LEFT JOIN 创建 JPA NamedQuery

使用 Int 的 Java jSF NamedQuery

java NamedQuery(通常在域对象中定义)

不断收到“java.lang.IllegalArgumentException:没有为该名称定义查询”,即使我有具有适当名称的@NamedQuery

从 JPA 实体的接口中检索 @NamedQuery

@NamedQuery 将表/列名称更改为大写导致异常