如果我的应用程序需要大量连接查询,我应该使用 ORM
Should i use ORM if my application requires a lot of join queries
我有 3 个实体
一世。资产(PK asset_id,FK category_id)
二.类别(PK category_id,FK:size_id)
三.尺码(PK size_id)
现在每个资产都属于一个类别(多对一)并且每个类别都有一个大小(多对一)
在典型的 ORM 中,我会触发一个资产检索查询,该查询又会调用 (SELECT * from asset)
现在当我调用 Asset.getCategory() 时,它会调用 (SELECT * from category)
调用 Caegory.getSize() 将调用 (SE:ECT * from size)
因此 OOP 中的单个实体检索进行 3 次数据库调用
就好像我写了一个连接查询,它在数据库调用上进行。
让我想知道,为什么我们使用 ORM。
你的假设是错误的。在 JPA 中,您可以使用 "fetch" 关键字查询整个对象图,这基本上会在一次查询中从数据库中获取所有数据。所以你会做类似
的事情
entityManager.createQuery("select asset from Asset asset join fetch asset.category cat join fetch cat.size size");
这将在一个查询中获取资产及其类别,以及该类别及其大小。除了这 3 个表很少之外,您通常可以通过基本连接连接更多的表而不会出现性能问题。
我有 3 个实体 一世。资产(PK asset_id,FK category_id) 二.类别(PK category_id,FK:size_id) 三.尺码(PK size_id)
现在每个资产都属于一个类别(多对一)并且每个类别都有一个大小(多对一) 在典型的 ORM 中,我会触发一个资产检索查询,该查询又会调用 (SELECT * from asset) 现在当我调用 Asset.getCategory() 时,它会调用 (SELECT * from category) 调用 Caegory.getSize() 将调用 (SE:ECT * from size)
因此 OOP 中的单个实体检索进行 3 次数据库调用 就好像我写了一个连接查询,它在数据库调用上进行。 让我想知道,为什么我们使用 ORM。
你的假设是错误的。在 JPA 中,您可以使用 "fetch" 关键字查询整个对象图,这基本上会在一次查询中从数据库中获取所有数据。所以你会做类似
的事情entityManager.createQuery("select asset from Asset asset join fetch asset.category cat join fetch cat.size size");
这将在一个查询中获取资产及其类别,以及该类别及其大小。除了这 3 个表很少之外,您通常可以通过基本连接连接更多的表而不会出现性能问题。