gpt4 book ai didi

java - Ebean 中的部分对象

转载 作者:行者123 更新时间:2023-11-30 08:02:38 27 4
gpt4 key购买 nike

我正在尝试在 Java Play 中使用 Ebean 2.3.3 查询部分对象!框架 2.2.1。例如,要获取仅包含 instance_config 中的 idhostpublicKey 字段的记录列表> 表,我使用以下内容:

List<InstanceConfig> tests = Ebean.find(InstanceConfig.class)
.select("host,publicKey")
.where().eq("accountId", accountId).ne("host", "")
.findList();

这会产生以下 sql 查询,这是我所期望的:

[debug] c.j.b.PreparedStatementHandle - select t0.id as c0, t0.host as c1, 
t0.public_key as c2 from instance_config t0 where t0.account_id = xxxxxxxxxx
and t0.host <> ''

但是,相同的代码还会为正在查询的表中的每条记录生成此查询:

    [debug] c.j.b.PreparedStatementHandle - select t0.id as c0, t0.host as c1, 
t0.public_key as c2, t0.private_key as c3, t0.created_by as c4,
t0.account_id as c5 from instance_config t0 where t0.id = xx

从服务器返回的输出包含完整的对象以及所有字段。

我猜这些查询与 Lazy Loading 有关Ebean 对部分对象执行的操作?

我在这个SO question中找到了绕过延迟加载的一种方法是完全绕过 Ebean 并使用标准 JDBC 接口(interface)来执行查询。由于这个问题已经有几年了,我想重新发帖询问这个解决方案是否仍然准确?

最佳答案

很难说出您的问题具体是什么,但通常出于性能原因您希望使用部分对象查询,并且在执行此操作时通常会避免延迟加载。因此,在您的情况下,也许您应该简单地从第一个查询中删除 select() 子句。

延迟加载并不总是不好,但在您的情况下,如果您想避免它,只需删除 select 子句,然后所有属性将加载到原始查询中。

现在在具有摘要级别日志记录的日志中(“org.avaje.ebean.SUM”上的调试级别)例如:

... txn[2005] select t0.id c0 from be_customer t0; --bind()
... txn[2005] FindMany type[Customer] origin[5NLfz.CdTSLn.BvQ020] exeMicros[0] rows[0] name[] predicates[] bind[]
... txn[2006] select t0.id c0, t0.inactive c1, t0.name c2, t0.registered c3, t0.comments c4, t0.version c5, t0.when_created c6, t0.when_updated c7, t0.billing_address_id c8, t0.shipping_address_id c9 from be_customer t0 where t0.id = ? ; --bind(1)
... txn[2006] FindMany mode[+lazy] type[Customer] origin[5NLfz.CdTSLn.BvQ020] lazyLoadProp[name] load[path:null batch:1] exeMicros[1079] rows[1] name[] predicates[] bind[1]

在最后一个日志条目中:

  • +lazy :这是一个延迟加载查询
  • LazyLoadProp[name]:这是触发延迟加载的属性读取
  • origin[5NLfz.CdTSLn.BvQ020]:标识延迟加载关联的源查询

现在,并非所有延迟加载都是不好的,但在您的情况下,我们可以看到您的表不是很宽(延迟加载查询中没有那么多列),但我们不知道类型(其中有任何大的 varchar 列) ETC)。我猜想你可能应该删除 select() 子句。

如果您将“org.avaje.ebean.SUM”的调试日志级别设置为“org.avaje.ebean.SUM”,那么您可以查找+惰性查询,检查它们关联的原始查询,并检查您是否可以做得更好。

希望有帮助。

关于java - Ebean 中的部分对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664854/

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