# 搜索结果

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ldap/result.html](https://docs.oracle.com/javase/tutorial/jndi/ldap/result.html)

当您使用 [`DirContext`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html)接口中的搜索方法时，您将返回 [`NamingEnumeration`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NamingEnumeration.html)。 `NamingEnumeration` 中的每个项目都是 [`SearchResult`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchResult.html)，其中包含以下信息：

*   [姓名](#NAME)
*   [对象](#OBJ)
*   [类名称](#CLASS)
*   [属性](#ATTRS)

每个 `SearchResult` 都包含满足搜索过滤器的 LDAP 条目的名称。您可以使用 [`getName（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NameClassPair.html#getName--) 获取条目的名称。该方法将[条目 _ 相对 _ 的 [`复合名称`](https://docs.oracle.com/javase/8/docs/api/javax/naming/CompositeName.html) 返回到 _ 目标上下文 _。目标上下文是`名称`参数解析的上下文。在 LDAP 用语中，目标上下文是搜索的 _ 基础对象 _。这是一个例子。

```
NamingEnumeration answer = ctx.search("ou=NewHires", 
    "(&(mySpecialKey={0}) (cn=*{1}))",  // Filter expression
    new Object[]{key, name},                // Filter arguments
    null);                                  // Default search controls

```

此示例中的目标上下文是由`“ou = NewHires”`命名的。 `答案`中 `SearchResult` 中的名称与`“ou = NewHires”`有关。例如，如果 `getName（）`返回`“cn = J.Duke”`，则其相对于 `ctx` 的名称将为`“cn = J. Duke，ou = NewHires“`。

如果您使用 [`SearchControls.SUBTREE_SCOPE`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#SUBTREE_SCOPE)或 [`SearchControls.OBJECT_SCOPE`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#OBJECT_SCOPE)执行搜索并且目标上下文本身满足搜索过滤器，则返回的名称将是“”（空名称），因为这是相对于目标上下文的名称。

这不是全部。如果搜索涉及推荐（参见 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/ldap/referral/index.html)）或解除引用别名（参见 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/ldap/misc/aliases.html)），那么相应的 `SearchResult` 将具有不是的名称相对于目标上下文。相反，它们将是直接引用该条目的 URL。要确定 `getName（）`返回的名称是相对还是绝对，请使用 [`isRelative（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NameClassPair.html#isRelative--) 。如果此方法返回 `true` ，则该名称相对于目标上下文;如果它返回 `false` ，则该名称是 URL。

如果名称是 URL 并且您需要使用该 URL，则可以将其传递给理解 URL 的初始上下文（请参阅 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/ldap/misc/url.html)）。

如果你需要获得条目的完整 DN，你可以使用 [`NameClassPair.getNameInNamespace（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NameClassPair.html#getNameInNamespace--) 。

如果进行搜索请求返回条目的对象[（ `SearchControls.setReturningObjFlag（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#setReturningObjFlag-boolean-) 用 `true` ）调用，则 `SearchResult` 将包含表示该条目的对象。要检索此对象，请调用 [`getObject（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Binding.html#getObject--) 。如果 `java.io.Serializable` ， [`可参考`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Referenceable.html) 或 [`参考`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Reference.html) 对象先前已绑定到该 LDAP 名称，然后条目中的属性用于重建该对象（参见 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/objects/reading/search.html)中的示例）。否则，条目中的属性用于创建表示 LDAP 条目的 `DirContext` 实例。在任何一种情况下，LDAP 提供程序都会在对象上调用 [`DirectoryManager.getObjectInstance（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/spi/DirectoryManager.html#getObjectInstance-java.lang.Object-javax.naming.Name-javax.naming.Context-java.util.Hashtable-javax.naming.directory.Attributes-) 并返回结果。

如果进行搜索以请求返回条目的对象，则从返回的对象派生类名。如果搜索请求的属性包括检索 LDAP 条目的`“javaClassName”`属性，则类名称是该属性的值。否则，类名是`“javax.naming.directory.DirContext”`。类名从 [`getClassName（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NameClassPair.html#getClassName--) 获得。

执行搜索时，可以通过向 [`搜索（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#search-javax.naming.Name-javax.naming.directory.Attributes-java.lang.String:A-) 方法之一提供参数或使用 [`设置搜索控件来选择返回属性 SearchControls.setReturningAttributes（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#setReturningAttributes-java.lang.String:A-) 。如果未明确指定任何属性，则返回所有 LDAP 条目的属性。要指定不返回任何属性，必须传递一个空数组（ `new String [0]` ）。

要检索 LDAP 条目的属性，请在 `SearchResult` 上调用 [`getAttributes（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchResult.html#getAttributes--) 。

## 响应控制

有关如何检索搜索结果的响应控件的详细信息，请参阅 JNDI 教程的[控件和扩展](https://docs.oracle.com/javase/jndi/tutorial/ldap/ext/response.html)课程。