gpt4 book ai didi

java - Datanucleus 创建子查询而不是连接

转载 作者:行者123 更新时间:2023-12-02 02:59:10 26 4
gpt4 key购买 nike

我有这些注释:

public class Account {
@Persistent(defaultFetchGroup = "true", dependent = "false")
@Column(name = "user_owner_id")
private User user;
}

public class User {
@Persistent(defaultFetchGroup = "true", mappedBy = "user")
@Element(column = "user_owner_id", dependent = "true")
private Set<Account> accounts;
}

启动 Account 类时,对数据库的查询使用 SELECT * FROM Accounts where isn't (SELECT id from users where id=23)

我试图给 datanucleus 一个注释,告诉它在数据库上运行SELECT a.* FROM accounts a JOIN users u on a.id = u.user_id where u.id = 23因为这样更优化。

那么我应该使用哪个注释来使数据核改变其查询形式?

---添加----

这是我们检索数据方式的精简版本:

PersistenceManager persistenceManager = persistenceManagerFactory.getPersistenceManager();
persistenceManager.getFetchPlan().setMaxFetchDepth(FetchPlan.FETCH_SIZE_GREEDY);

Query query = persistenceManager.newQuery("javax.jdo.query.JDOQL", null);

query.setClass(User.class);
query.setFilter("this.uuid==p1");
query.declareParameters("java.lang.String p1");

final List<E> entities = (List<E>) query.execute(uuid);

E entity = entities.iterator().next();

return persistenceManager.detachCopy(entity);

最佳答案

您执行查询只是为了获取一个对象,这是非常低效的。相反,你可以轻松做到

User u = pm.getObjectById(User.class, 1);

这可能总共会发出 2 个 SQL; 1 获取基本用户对象,1 获取连接到该用户的帐户。不会有 EXISTS 子句。

关于你实际在做什么。发出查询。查询是通用的,在大多数用例中将返回多个对象。查询的过滤子句可能很复杂。查询被转换为 SQL 以获取基本的用户字段。它无法在一次调用中获取相关对象,因此您的日志可能会显示有关 BULK FETCH 的内容(或类似的内容,无论 DataNucleus 称之为什么)。这将有一个 EXISTS 子句,其中 EXISTS 子查询将第二个查询限制为查询适用的对象。他们这样做是为了避免 N+1 问题。一般来说,使用EXISTS最适合查询的一般情况。在您的具体情况下,最好有一个INNER JOIN,但我认为目前不支持将其作为BULK FETCH选项。他们的代码是开源的,我知道他们过去曾要求人们在需要替代处理的情况下贡献一些东西......因此,如果您想在这种精确情况下使用查询,您可以贡献一些东西。

关于java - Datanucleus 创建子查询而不是连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42630629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com