diff --git a/ebean-querybean/src/main/java/io/ebean/typequery/TQRootBean.java b/ebean-querybean/src/main/java/io/ebean/typequery/TQRootBean.java index 728184cf4..9803da8b1 100644 --- a/ebean-querybean/src/main/java/io/ebean/typequery/TQRootBean.java +++ b/ebean-querybean/src/main/java/io/ebean/typequery/TQRootBean.java @@ -213,20 +213,38 @@ public abstract class TQRootBean { /** * Set a FetchGroup to control what part of the object graph is loaded. *

- * This is an alternative to using select() and fetch() providing a nice clean separation - * between what a query should load and the query predicates. - *

+ * FetchGroup is immutable and threadsafe. We expect to create and store + * FetchGroup to a static final field and reuse the instance. + *

+ * FetchGroup is an alternative to using select() and fetch() providing a nice + * clean separation between what a query should load and the query predicates. * *

{@code
    *
-   * FetchGroup fetchGroup = FetchGroup.of(Customer.class)
-   *   .select("name, status")
-   *   .fetch("contacts", "firstName, lastName, email")
-   *   .build();
+   * // immutable threadsafe
    *
-   * List customers =
+   * static final FetchGroup fetchGroup =
+   *   QCustomer.forFetchGroup()
+   *     .shippingAddress.fetch()
+   *     .contacts.fetch()
+   *     .buildFetchGroup();
    *
-   *   new QCustomer()
+   * List customers = new QCustomer()
+   *   .select(fetchGroup)
+   *   .findList();
+   *
+   * }
+ * + * + *
{@code
+   *
+   * static final FetchGroup fetchGroup =
+   *   FetchGroup.of(Customer.class)
+   *     .select("name, status")
+   *     .fetch("contacts", "firstName, lastName, email")
+   *     .build();
+   *
+   * List customers = new QCustomer()
    *   .select(fetchGroup)
    *   .findList();
    *
diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java
index 78fd99779..3d55fd1ad 100644
--- a/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java
+++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java
@@ -188,6 +188,24 @@ class SimpleQueryBeanWriter {
     writer.eol();
     writer.append("  /**").eol();
     writer.append("   * Return a query bean used to build a FetchGroup.").eol();
+    writer.append("   * 

").eol(); + writer.append(" * FetchGroups are immutable and threadsafe and can be used by many").eol(); + writer.append(" * concurrent queries. We typically stored FetchGroup as a static final field.").eol(); + writer.append(" *

").eol(); + writer.append(" * Example creating and using a FetchGroup.").eol(); + writer.append(" *

{@code").eol();
+    writer.append("   * ").eol();
+    writer.append("   * static final FetchGroup fetchGroup = ").eol();
+    writer.append("   *   QCustomer.forFetchGroup()").eol();
+    writer.append("   *     .shippingAddress.fetch()").eol();
+    writer.append("   *     .contacts.fetch()").eol();
+    writer.append("   *     .buildFetchGroup();").eol();
+    writer.append("   * ").eol();
+    writer.append("   * List customers = new QCustomer()").eol();
+    writer.append("   *   .select(fetchGroup)").eol();
+    writer.append("   *   .findList();").eol();
+    writer.append("   * ").eol();
+    writer.append("   * }
").eol(); writer.append(" */").eol(); writer.append(" public static Q%s forFetchGroup() {", shortName).eol(); writer.append(" return new Q%s(FetchGroup.queryFor(%s.class));", shortName, shortName).eol();