我有两个对象,都定义为实体,一个包含另一个如下:
@Entity
public class TestC
{
@Id @GeneratedValue
private Integer id;
@ManyToOne (cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
TestD d;
}
@Entity
public class TestD
{
@Id @GeneratedValue
private Integer id;
String moo;
}
实体被持久化:
TestC c2 = new TestC();
TestD d2 = new TestD();
d2.moo = "d2";
c2.d = d2;
em.getTransaction().begin();
em.persist(d2);
em.persist(c2);
em.getTransaction().commit();
我正在尝试使用 TestD 的实例查询 TestC 对象:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<TestC> query = builder.createQuery(TestC.class);
Root<TestC> from = query.from(TestC.class);
ParameterExpression<TestD> pe = builder.parameter(TestD.class);
query.where(builder.equal(pe, from.<TestD>get("d")));
TestC found = em.createQuery(query)
.setParameter(pe, d2)
.getSingleResult();
但是EclipseLink在运行查询时会出现以下错误(注意“(?=)”附近的SQL无效,TestD对象没有列名):
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid argument value: java.io.NotSerializableException
Error Code: 0
Call: SELECT t1.ID, t1.D_ID FROM TESTD t0, TESTC t1 WHERE ((? = ) AND (t0.ID = t1.D_ID))
bind => [1 parameter bound]
Query: ReadAllQuery(referenceClass=TestC sql="SELECT t1.ID, t1.D_ID FROM TESTD t0, TESTC t1 WHERE ((? = ) AND (t0.ID = t1.D_ID))")
我构建查询错误吗?
谢谢你的帮助!