相关文档 下载本手册

4.3.1.17 查询

一个 Query 实例代表一个带有绑定参数的特定查询。该实例由方法 com.mysql.clusterj.Session.<T>createQuery(com.mysql.clusterj.query.QueryDefinition<T>) 创建。

4.3.1.17.1 概述
 public interface Query<E> {
// Public Static Fields  public static final String INDEX_USED = "IndexUsed";
  public static final String SCAN_TYPE = "ScanType";
  public static final String SCAN_TYPE_INDEX_SCAN = "INDEX_SCAN";
  public static final String SCAN_TYPE_PRIMARY_KEY = "PRIMARY_KEY";
  public static final String SCAN_TYPE_TABLE_SCAN = "TABLE_SCAN";
  public static final String SCAN_TYPE_UNIQUE_KEY = "UNIQUE_KEY";
// Public Methods  public abstract int deletePersistentAll();
  public abstract Results<E> execute(Object parameter);
  public abstract Results<E> execute(Object[] parameters);
  public abstract Results<E> execute(Map<String, ?> parameters);
  public abstract Map<String, Object> explain();
  public abstract List<E> getResultList();
  public abstract void setLimits(long skip,
                                 long limit);

  public abstract void setOrdering(Ordering ordering,
                                   String[] orderingFields);

  public abstract void setParameter(String parameterName,
                                    Object value);

}
4.3.1.17.2 INDEX_USED
public static final String INDEX_USED = "IndexUsed";

查询解释索引使用的键

4.3.1.17.3 SCAN_TYPE
public static final String SCAN_TYPE = "ScanType";

查询解释扫描类型键

4.3.1.17.4 SCAN_TYPE_INDEX_SCAN
public static final String SCAN_TYPE_INDEX_SCAN = "INDEX_SCAN";

查询解释扫描类型值,用于索引扫描

4.3.1.17.5 SCAN_TYPE_PRIMARY_KEY
public static final String SCAN_TYPE_PRIMARY_KEY = "PRIMARY_KEY";

查询解释扫描类型值,用于主键

4.3.1.17.6 SCAN_TYPE_TABLE_SCAN
public static final String SCAN_TYPE_TABLE_SCAN = "TABLE_SCAN";

查询解释扫描类型值,用于表扫描

4.3.1.17.7 SCAN_TYPE_UNIQUE_KEY
public static final String SCAN_TYPE_UNIQUE_KEY = "UNIQUE_KEY";

查询解释扫描类型值,用于唯一键

4.3.1.17.8 deletePersistentAll()
public abstract int deletePersistentAll();

删除满足查询条件的实例。

表 4.35 deletePersistentAll()

参数 描述
return 删除的实例数量

4.3.1.17.9 execute(Map<String, ?>)
public abstract Results<E> execute(Map<String, ?> parameters);

使用一个或多个命名参数执行查询。参数按名称解析。

表 4.36 execute(Map<String, ?>)

参数 描述
parameters 参数
return the result

4.3.1.17.10 execute(Object...)
public abstract Results<E> execute(Object[] parameters);

使用一个或多个参数执行查询。参数按在查询中声明的顺序解析。

表 4.37 execute(Object...)

参数 描述
parameters 参数
return the result

4.3.1.17.11 execute(Object)
public abstract Results<E> execute(Object parameter);

使用恰好一个参数执行查询。

表 4.38 execute(Object)

参数 描述
parameter 参数
return the result

4.3.1.17.12 explain()
public abstract Map<String, Object> explain();

解释此查询将如何执行或已如何执行。如果在绑定所有参数之前调用,则会抛出 ClusterJUserException。返回一个键值对映射,解释查询将如何执行或已如何执行。可以通过对值的 toString 调用获取详细信息。返回以下键

  • ScanType:扫描类型,取值包括

    • PRIMARY_KEY:查询使用主键进行键查找

    • UNIQUE_KEY:查询使用唯一键进行键查找

    • INDEX_SCAN:查询使用非唯一键进行范围扫描

    • TABLE_SCAN:查询使用表扫描

  • IndexUsed:使用的索引名称(如果有)

表 4.39 explain()

参数 描述
return 有关此查询执行的信息

异常

ClusterJUserException

如果没有绑定所有参数

4.3.1.17.13 getResultList()
public abstract List<E> getResultList();

将结果作为列表获取。

表 4.40 getResultList()

参数 描述
return the result

异常

ClusterJUserException

如果没有绑定所有参数

ClusterJDatastoreException

如果数据存储报告异常

4.3.1.17.14 setLimits(long, long)
public abstract void setLimits(long skip,
                               long limit);

设置要返回的结果的限制。查询的执行被修改为仅返回结果的子集。如果过滤器通常会返回 100 个实例,skip 设置为 50,limit 设置为 40,那么将跳过本应返回的前 50 个结果,返回接下来的 40 个结果,而忽略剩余的 10 个结果。

参数 skip 必须大于或等于 0(参见下面的异常),limit 必须大于或等于 0。

当与 deletePersistentAll 一起使用时,skip 必须为 0,并且应该迭代地删除实例,直到删除的实例数量小于批次大小。例如

/* Delete in batches */ 
query.setLimits(0, DeleteBatchSize);
int result = 0;
do { result = query.deletePersistentAll();
 System.out.println("Batch result: " + result);
 } while(result == DeleteBatchSize);

表 4.41 setLimits(long, long)

参数 描述
skip 要跳过的结果数量
limit 跳过后要返回的结果数量;对无限制使用 Long.MAX_VALUE。

4.3.1.17.15 setOrdering(Query.Ordering, String...)
public abstract void setOrdering(Ordering ordering,
                                 String[] orderingFields);

设置此查询结果的排序。查询的执行被修改为使用之前定义的索引。

  • 必须在映射到排序字段的列上定义一个索引,排序顺序应与排序字段的顺序相同。

  • 排序字段相对于索引不能有间隙。

  • 所有排序字段都必须在索引中,但索引中的所有字段都不需要在排序字段中。

  • 如果在排序字段上使用“in”谓词,则它只能与第一个字段一起使用。

  • 如果违反了这些条件中的任何一个,则在执行查询时会抛出 ClusterJUserException。

如果使用“in”谓词,则参数中的每个元素都定义一个单独的范围,并且排序在该范围内执行。可能存在基于过滤器的更好的(更有效的)索引,但指定排序将强制查询使用包含排序字段的索引。

表 4.42 setOrdering(Query.Ordering, String...)

参数 描述
排序方式 Ordering.ASCENDING 或 Ordering.DESCENDING
排序字段 要排序的字段

4.3.1.17.16 setParameter(String, Object)
public abstract void setParameter(String parameterName,
                                  Object value);

设置参数的值。如果对同一个参数多次调用此方法,会静默地替换该值。

表 4.43 setParameter(String, Object)

参数 描述
参数名 参数的名称
参数的值