我有点困惑,如果我有两个相关的表,那么我将在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抽象模式不存在。
由于 普拉香特
答案 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而不是直接结算。