当前位置: 首页 > 面试题库 >

连接许多表时如何使用JPA Criteria API

罗俭
2023-03-14
问题内容

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Company> criteria = criteriaBuilder.createQuery( Company.class );
Root<Company> companyRoot = criteria.from( Company.class );
Join<Company,Product> products = companyRoot.join("dentist");
Join<Company, City> cityJoin = companyRoot.join("address.city");//Company->Address->City-city
criteria.where(criteriaBuilder.equal(products.get("category"), "dentist"),      criteriaBuilder.equal(cityJoin.get("city"),"Leeds"));

公司有一个地址,地址内有City-pojo和Country-
Pojo。如何在其中使用它JOIN?我尝试引用它,address.city但出现了错误消息:

来自托管类型[EntityTypeImpl @ 1692700229:Company
[javaType:类com.test.domain.Company描述符:RelationalDescriptor(com.test.domain.Company->
[DatabaseTable(COMPANY)]))的属性[address.city]映射:16]]不存在。


问题答案:

如果使用规范的Metamodel,将避免此类错误。在您的代码中,您滥用了“
dentist”关键字,这可能是导致错误的原因,因为“ dentist”不是Company实体中的字段。

但是,看看在另一个问题中如何定义类,join使用Metamodel 定义的方法是:

SetJoin<Company,Product> products = companyRoot.join(Company_.products);

如您所见,Metamodel避免使用字符串,因此避免了很多运行时错误。如果仍然不使用元模型,请尝试以下操作:

SetJoin<Company,Product> products = companyRoot.join("products");

如果现在要添加predicate,即在后面添加内容,则应where编写类似以下内容的内容:

Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist");
criteria.where(predicate);

如果要join为City实体添加一个:

Join<Company, City> city = companyRoot.join(Company_.city);
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(city.get(City_.cityName), "Leeds");
criteria.where(predicate);

(假设cityName字段是您所在城市的正确字段名称)。



 类似资料:
  • > 帐户表:accountId(PK)电子邮件密码 account_profile表:accountId(PK)(fk到account)昵称 团体表:articleId(PK)accountId(fk to account)标题内容 现在我想要下面的JPQL是查询DSL代码 我有实体元模型-QAccount、QAccountProfile、QCommunity 此外,我必须通过分页获得结果,因此应

  • 我是Java Spring的新手,学习JDBC模板来访问数据库。现在我有3个关系表,我需要使用JDBC模板连接它们,并需要打印结果。我如何实现它。任何可行的例子都会对我有很大帮助。 谢谢

  • 问题内容: 我有以下数据库结构/层次结构: TABLE product_type : TABLE product : parent_id :是product_type ID TABLE treeNode : 它是一个树层次结构(根有n个子节点),层次结构的数量 未知 。 col的值为 “ CATEGORY” 或 “ GROUP” ,这意味着我有2棵树: Categories: Groups: TA

  • 问题内容: 我有2张桌子: 电影:movieID 用户:userID 这些表通过Queue表具有多对多关系,并带有一个附加属性listOrder: 队列:movieID,userID,listOrder 我正在尝试使用EclipseLink对此模型建模,但是却收到“不兼容映射”错误。这是我的代码的示例: QueueItemPK的目的是使我可以拥有movieID和userID的复合主键。我不确定这是

  • 下面的代码片段是从JoinedStreams的javadoc复制的 这两个流仅基于一个键(通过< code>t =计算)进行连接 我会问我如何基于多个键进行连接,例如,one.a = two.a和

  • 我正在尝试使用条件连接多个表,但遇到了一些问题,请帮助我:我有一个sql查询,如: 这三个表:截止时间(has country)、国家、交易所(has country)是3个实体类。 我如何使用hibernate标准像这样加入,我下面的代码仍然不完整: