[英]JPA: query clause on reverse mapping field - Parameter is not set
我已经做了这个简单的领域,以了解为什么以下查询将不起作用。
@Entity
public class Owner {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(cascade = CascadeType.ALL)
private Reverse reverse;
//getters / setters
}
@Entity
public class Reverse {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(mappedBy = "reverse")
private Owner owner;
//getters / setters
}
该测试失败:
@Test
@Transactional
public void testQueryByEntity() throws Exception {
Reverse reverse = new Reverse();
Owner owner = new Owner();
owner.setReverse(reverse);
entityManager.persist(owner);
entityManager.flush();
entityManager.clear();
Reverse dbReverse =
em.createQuery("from Reverse r where r.owner = :owner", Reverse.class)
.setParameter("owner", owner)
.getSingleResult();
System.out.println("Revrse id: " + dbReverse.getId());
}
除了以下例外:
Caused by: org.h2.jdbc.JdbcSQLException: Parameter "#2" is not set; SQL statement:
select reverse0_.id as id1_ from T_ORDER reverse0_ where reverse0_.id=? limit ? [90012-156]
所有者方面的相同查询有效:
Owner dbOwner =
em.createQuery("from Owner o where o.reverse = :reverse", Owner.class)
.setParameter("reverse", reverse)
.getSingleResult();
为了使查询工作,我需要以这种方式进行修改:
Reverse dbReverse =
em.createQuery("from Reverse r where r.owner.id = :ownerId", Reverse.class)
.setParameter("ownerId", owner.getId())
.getSingleResult();
所以我的问题是:
为什么如果where子句我有这个反向映射条件,我需要查询r.owner.id
而不是简单地r.owner
为了使我的查询工作?
谢谢!
由于Owner
类是owner of the relationship
的实际owner of the relationship
因此在Owner表中可以将反向表的主键用作外键。
因此,如果您从所有者表(owner.reverse)引用反向,则可以使用所有者表中可用的映射反向ID来获取它。
但是反向映射是-反向表在其表中将没有所有者表的ID,因此,如果您尝试说reverse.owner,则无法从其表中获取它。
因此,您必须使用reverse.owner.id从相反的表中获取ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.