对于根据关系创建的表的类型化查询(一对多)

时间:2015-03-27 02:41:20

标签: jpa junit

我有点困惑,如果我有两个相关的表,那么我将在MySQL中有一个组合表,因为我们的项目中没有类,我的Typed Query如何从表中获取数据从关系中创造(比如一对多)。

例如:

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CustomerBilling",joinColumns = @JoinColumn(name = "Customer_Id"),
inverseJoinColumns = @JoinColumn(name = "Billing_Id"))
private List<Billing> billing = new ArrayList<>();

使用上面提到的代码我将拥有CustomerBilling表,所以我想获得特定客户ID的所有记录。在我的测试(jUnit)文件中我需要输入什么类型的查询?

TypedQuery<Customer> a = em.createQuery("select b from CustomerBilling b where b.Customer_Id =?1", Customer.class);

这不起作用因为CustomerBilling抽象模式不存在。

由于 普拉香特

1 个答案:

答案 0 :(得分:0)

我确信你的项目中有类,因为它是基于java的:)

在行之间阅读,您的意思是,您在DB Customer,Billing和CustomerBilling中有3个表,但JPA中只有2个实体Customer和Billing,因为CustomerBilling只存储该关系。 (但是你的类型化查询的例子试图将Customer.class作为结果,所以也许我错了。)

您不能直接引用可加入对象(除非它们被映射)。 您可以按客户或通过结算进行查询,但不能通过CustomerBilling进行查询。如果JPA中没有定义此类实体,则JPA无法查询。

你不应该尝试这样做,即使是单元测试(BTW jpa测试是集成测试而不是单元测试)。 将关系映射到@OntToMany的重点是从程序中隐藏实际的DB结构。因此,您应该访问客户的Billings或客户的账单,而不是关系信息。 目前,关系是通过连接表存储的,但它可以将其更改为连接列,整个程序逻辑将保持不变(测试也应如此)。

您应该测试一下,如果您向客户添加天花板并保存它们,您就可以正确检索它们,如果您从客户处删除了它,它就会消失,但没有理由检查连接表的内容。

最后,如果您真的必须,可以使用本机SQL查询来访问CustomerBilling表

em.createNativeQuery

或 您可以更改您的映射,并介绍CustomerBilling实体,并将客户的OneToMay映射到CustomerBilling而不是直接结算。

相关问题