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
不断收到“java.lang.IllegalArgumentException:没有为该名称定义查询”,即使我有具有适当名称的@NamedQuery