Session: Querying: How to use transformers in queries?

Transformers can be used with session queries using transformWith method.

Syntax

<S> IRavenQueryable<S> transformWith(String transformerName, Class<S> resultClass);

<S> IRavenQueryable<S> transformWith(Class<? extends AbstractTransformerCreationTask> transformerClazz, Class<S> resultClass);
Parameters
transformerName String Name of a transformer to use.
Return Value
IRavenQueryable Instance implementing IRavenQueryable interface containing additional query methods and extensions.

Example I

// return up to 128 entities from 'Products' collection
// transform results using 'Products_Name' transformer
// which returns only 'name' field, rest will be 'null'
QProduct p = QProduct.product;
List<Product> results = session
  .query(Product.class)
  .where(p.name.eq("Chocolade"))
  .transformWith(Products_Name.class, Product.class)
  .toList();

Example II

Loading document inside transformer and projecting results to different type.

public class ProductWithCategoryAndSupplier {
  private String name;
  private Supplier supplier;
  private Category category;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Supplier getSupplier() {
    return supplier;
  }
  public void setSupplier(Supplier supplier) {
    this.supplier = supplier;
  }
  public Category getCategory() {
    return category;
  }
  public void setCategory(Category category) {
    this.category = category;
  }
}

public class Products_WithCategoryAndSupplier extends AbstractTransformerCreationTask {
  public Products_WithCategoryAndSupplier() {
    transformResults = "from product in results               " +
             " select new {                                   " +
             "     Name = product.Name,                       " +
             "     Category = LoadDocument(product.Category), " +
             "     Supplier = LoadDocument(product.Supplier)  " +
             " }";
  }
}

// return 1 entity from 'Products' collection
// transform results using 'Products_WithCategoryAndSupplier' transformer
// project results to 'ProductWithCategoryAndSupplier' class
QProduct p = QProduct.product;
ProductWithCategoryAndSupplier product = session
  .query(Product.class)
  .where(p.name.eq("Chocolade"))
  .transformWith(Products_WithCategoryAndSupplier.class, ProductWithCategoryAndSupplier.class)
  .first();

assertEquals("Chocolade", product.getName());
assertEquals("Confections", product.getCategory().getName());
assertEquals("Zaanse Snoepfabriek", product.getSupplier().getName());