【问题标题】:How to sort strings in OQL如何在 OQL 中对字符串进行排序
【发布时间】:2016-12-02 18:28:48
【问题描述】:

我试过了:

select sort(obj.displayName, 'lhs < rhs') from my.org.BusinessClass obj

和

select sort(obj.displayName, 'lhs.toString() < rhs.toString()') from my.org.BusinessClass obj

两者都给我字符数组结果,但它们都不是按字符串排序的。我认为它是按对象 id 排序的。

我也试过了:

select sort(obj.displayName, lhs < rhs) from my.org.BusinessClass obj 
select sort(obj.displayName, lhs.toString() < rhs.toString()) from my.org.BusinessClass obj

但是这些会导致错误,因为排序第二个参数是字符串表达式。

VisualVM 文档中的示例仅适用于数字: Analyzing a Heap Dump Using Object Query Language (OQL)

类的结构如下:

package my.org;
public class BusinessClass {
    private String displayName;
    // rest of class omitted for brevity 
}

【问题讨论】:

    标签: java visualvm oql


    【解决方案1】:

    您可以使用以下查询在 OQL 中对字符串进行排序:

    select sort(heap.objects('java.lang.String'), 'lhs.toString().localeCompare(rhs.toString())')
    

    在您的情况下,使用此 OQL 查询按 displayName 对您的业务对象进行排序:

    select sort(heap.objects('my.org.BusinessClass'), 'lhs.displayName.toString().localeCompare(rhs.displayName.toString())')
    

    如果您想在输出中查看您的业务对象和实际 displayName,请使用此 OQL 查询:

    select map(sort(heap.objects('my.org.BusinessClass'), 'lhs.displayName.toString().localeCompare(rhs.displayName.toString())'), 'toHtml(it)+" "+it.displayName.toString()')
    

    【讨论】:

    • 我试过select sort(obj.displayName, 'lhs.toString().localeCompare(rhs.toString())') from my.org.BusinessClass obj,但它似乎仍然按对象ID而不是字符串内容排序。它看起来是 heap.objects('java.lang.String') 吗?
    • 是的,你必须使用 heap.objects()。我更新了上面的答案以完全符合您的情况。
    【解决方案2】:

    这是我使用的解决方法:

    1. 增加 OQL 返回的最大行数
      1. (见:Increasing the Max Size of OQL Result)
    2. 将未排序的查询结果复制并粘贴到文本文件中
    3. 使用 vim 或类似的文本处理器删除对象 id
    4. 使用 unix 排序进行排序

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多