Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 从关系(一对多)创建的表的类型化查询_Jpa_Junit - Fatal编程技术网

Jpa 从关系(一对多)创建的表的类型化查询

Jpa 从关系(一对多)创建的表的类型化查询,jpa,junit,Jpa,Junit,我有点困惑,若我有两个相关的表,那个么我将在MySQL中有一个组合表,因为我们的项目中并没有类,我的类型化查询将如何从关系创建的表中获取数据(比如一对多) 例如: @OneToMany(cascade=CascadeType.ALL) @JoinTable(name=“CustomerBilling”,joinColumns=@JoinColumn(name=“Customer\u Id”), inverseJoinColumns=@JoinColumn(name=“Billing\u Id”)

我有点困惑,若我有两个相关的表,那个么我将在MySQL中有一个组合表,因为我们的项目中并没有类,我的类型化查询将如何从关系创建的表中获取数据(比如一对多)

例如:

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name=“CustomerBilling”,joinColumns=@JoinColumn(name=“Customer\u Id”),
inverseJoinColumns=@JoinColumn(name=“Billing\u Id”))
私有列表计费=新建ArrayList();
有了上面提到的代码,我就有了CustomerBilling表,所以我想获得特定客户id的所有记录。在我的测试(jUnit)文件中,我需要输入什么类型的查询

TypedQuery<Customer> a = em.createQuery("select b from CustomerBilling b where b.Customer_Id =?1", Customer.class);
TypedQuery a=em.createQuery(“从CustomerBilling b中选择b,其中b.Customer\u Id=?1”,Customer.class);
这不起作用,因为CustomerBilling abstrate架构不存在

谢谢
Prashanth

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

从行中可以看出,您的意思是,在DB Customer、Billing和CustomerBilling中有3个表,但在JPA中只有2个实体Customer和Billing,因为CustomerBilling仅用于存储关系。(但是您的类型化查询示例尝试获取Customer.class作为结果,因此可能我错了)

您不直接引用可连接对象(除非它们已映射)。 您可以按客户查询,也可以按帐单查询,但不能按客户帐单查询。如果JPA中没有定义这样的实体,那么JPA就没有什么可以查询的

您不应该尝试这样做,即使是单元测试(顺便说一句,jpa测试是集成测试而不是单元测试)。 映射与@OnteToMany等的关系的整个要点是对程序隐藏实际的数据库结构。因此,您应该访问客户的账单,或者客户的账单,而不是关系信息。 目前,该关系由联接表存储,但可以将其更改为联接列,整个程序逻辑将保持不变(测试也是如此)

您应该测试,如果您向customer添加并保存了biling,那么您可以正确地检索它们;如果您从customer中删除biling,则biling将消失,但是没有理由检查联接表的内容

最后,若确实需要,可以使用本机sql查询访问CustomerBilling表

em.createNativeQuery
或 您可以更改映射,引入CustomerBilling实体,并将OneToMay on Customer映射到CustomerBilling,而不是直接计费

em.createNativeQuery