blog: Rearrangements, better slides, more examples.

Change-Id: I5848bdbfddb5956e916bd967c880155490c8c8ba
diff --git a/blog/src/main/asciidoc/SLIDES.adoc b/blog/src/main/asciidoc/SLIDES.adoc
index 0775d42..b2efeb9 100644
--- a/blog/src/main/asciidoc/SLIDES.adoc
+++ b/blog/src/main/asciidoc/SLIDES.adoc
@@ -16,6 +16,7 @@
 :customcss: SLIDES.css
 :source-highlighter: highlightjs
 :highlightjs-theme: grayscale.css
+:table-stripes: hover
 :stem:
 
 
@@ -58,36 +59,6 @@
 
 
 [%notitle]
-=== Comments and Categories
-
-[source,java]
-----
-@Entity
-public class Comment extends PanacheEntity {
-
-  public String authorName;
-  public Instant publicationDate;
-  public String text;
-
-  @Enumerated(EnumType.STRING)
-  public SpamStatus spamStatus;
-
-  @ManyToOne(fetch = FetchType.LAZY)
-  public Post post;
-}
-----
-
-[source,java]
-----
-@Entity
-public class Category extends PanacheEntity {
-
-  public String name;
-}
-----
-
-
-[%notitle]
 === Authors, Login Credentials
 
 [source,java]
@@ -184,8 +155,7 @@
 [2021-02-27 10:32:58] 60 rows retrieved
 ----
 
-stem:[60 = ubrace|"posts"|_10 *
-ubrace|("comments")/("post")|_3 * ubrace|"categories"|_2]
+stem:[60 = ubrace|"posts"|_10 * ubrace|("comments")/("post")|_3 * ubrace|"categories"|_2]
 
 Cartesian explosion! 🙀
 
@@ -195,77 +165,28 @@
 [%notitle]
 === Bad Results (2)
 
-[%header,format=tsv]
-[.supersmall]
+[%header%autofit.supersmall,format=tsv,stripes=hover]
 |===
-post_id	com_id	cat_id	aut_id	body	pubdate	title	author_name	postid2	com_pubdate	spamp	com_text	postid3	com_id	cat_name	postid4	cat_id
-4	16	44	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133969	UNKNOWN	First post	4	16	Category #1	4	44
-4	15	44	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133963	UNKNOWN	First post	4	15	Category #1	4	44
-4	14	44	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133870	UNKNOWN	First post	4	14	Category #1	4	44
-4	16	45	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133969	UNKNOWN	First post	4	16	Category #0	4	45
-4	15	45	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133963	UNKNOWN	First post	4	15	Category #0	4	45
-4	14	45	1	""	2021-02-27 10:32:16.129627	Post #0	Anonymous Coward	4	2021-02-27 10:32:16.133870	UNKNOWN	First post	4	14	Category #0	4	45
-5	19	44	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135200	UNKNOWN	First post	5	19	Category #1	5	44
-5	18	44	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135192	UNKNOWN	First post	5	18	Category #1	5	44
-5	17	44	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135205	UNKNOWN	First post	5	17	Category #1	5	44
-5	19	45	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135200	UNKNOWN	First post	5	19	Category #0	5	45
-5	18	45	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135192	UNKNOWN	First post	5	18	Category #0	5	45
-5	17	45	2	""	2021-02-27 10:32:16.129674	Post #1	Anonymous Coward	5	2021-02-27 10:32:16.135205	UNKNOWN	First post	5	17	Category #0	5	45
-6	22	44	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136043	UNKNOWN	First post	6	22	Category #1	6	44
-6	21	44	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136038	UNKNOWN	First post	6	21	Category #1	6	44
-6	20	44	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136031	UNKNOWN	First post	6	20	Category #1	6	44
-6	22	45	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136043	UNKNOWN	First post	6	22	Category #0	6	45
-6	21	45	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136038	UNKNOWN	First post	6	21	Category #0	6	45
-6	20	45	3	""	2021-02-27 10:32:16.129700	Post #2	Anonymous Coward	6	2021-02-27 10:32:16.136031	UNKNOWN	First post	6	20	Category #0	6	45
-7	25	44	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136904	UNKNOWN	First post	7	25	Category #1	7	44
-7	24	44	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136897	UNKNOWN	First post	7	24	Category #1	7	44
-7	23	44	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136909	UNKNOWN	First post	7	23	Category #1	7	44
-7	25	45	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136904	UNKNOWN	First post	7	25	Category #0	7	45
-7	24	45	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136897	UNKNOWN	First post	7	24	Category #0	7	45
-7	23	45	1	""	2021-02-27 10:32:16.129724	Post #3	Anonymous Coward	7	2021-02-27 10:32:16.136909	UNKNOWN	First post	7	23	Category #0	7	45
-8	28	44	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137743	UNKNOWN	First post	8	28	Category #1	8	44
-8	27	44	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137739	UNKNOWN	First post	8	27	Category #1	8	44
-8	26	44	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137731	UNKNOWN	First post	8	26	Category #1	8	44
-8	28	45	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137743	UNKNOWN	First post	8	28	Category #0	8	45
-8	27	45	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137739	UNKNOWN	First post	8	27	Category #0	8	45
-8	26	45	2	""	2021-02-27 10:32:16.129746	Post #4	Anonymous Coward	8	2021-02-27 10:32:16.137731	UNKNOWN	First post	8	26	Category #0	8	45
-9	31	44	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138536	UNKNOWN	First post	9	31	Category #1	9	44
-9	30	44	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138548	UNKNOWN	First post	9	30	Category #1	9	44
-9	29	44	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138543	UNKNOWN	First post	9	29	Category #1	9	44
-9	31	45	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138536	UNKNOWN	First post	9	31	Category #0	9	45
-9	30	45	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138548	UNKNOWN	First post	9	30	Category #0	9	45
-9	29	45	3	""	2021-02-27 10:32:16.129767	Post #5	Anonymous Coward	9	2021-02-27 10:32:16.138543	UNKNOWN	First post	9	29	Category #0	9	45
-10	34	44	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139349	UNKNOWN	First post	10	34	Category #1	10	44
-10	33	44	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139354	UNKNOWN	First post	10	33	Category #1	10	44
-10	32	44	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139337	UNKNOWN	First post	10	32	Category #1	10	44
-10	34	45	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139349	UNKNOWN	First post	10	34	Category #0	10	45
-10	33	45	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139354	UNKNOWN	First post	10	33	Category #0	10	45
-10	32	45	1	""	2021-02-27 10:32:16.129789	Post #6	Anonymous Coward	10	2021-02-27 10:32:16.139337	UNKNOWN	First post	10	32	Category #0	10	45
-11	37	44	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140032	UNKNOWN	First post	11	37	Category #1	11	44
-11	36	44	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140025	UNKNOWN	First post	11	36	Category #1	11	44
-11	35	44	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140037	UNKNOWN	First post	11	35	Category #1	11	44
-11	37	45	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140032	UNKNOWN	First post	11	37	Category #0	11	45
-11	36	45	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140025	UNKNOWN	First post	11	36	Category #0	11	45
-11	35	45	2	""	2021-02-27 10:32:16.129809	Post #7	Anonymous Coward	11	2021-02-27 10:32:16.140037	UNKNOWN	First post	11	35	Category #0	11	45
-12	40	44	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140766	UNKNOWN	First post	12	40	Category #1	12	44
-12	39	44	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140786	UNKNOWN	First post	12	39	Category #1	12	44
-12	38	44	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140779	UNKNOWN	First post	12	38	Category #1	12	44
-12	40	45	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140766	UNKNOWN	First post	12	40	Category #0	12	45
-12	39	45	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140786	UNKNOWN	First post	12	39	Category #0	12	45
-12	38	45	3	""	2021-02-27 10:32:16.129839	Post #8	Anonymous Coward	12	2021-02-27 10:32:16.140779	UNKNOWN	First post	12	38	Category #0	12	45
-13	43	44	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141651	UNKNOWN	First post	13	43	Category #1	13	44
-13	42	44	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141655	UNKNOWN	First post	13	42	Category #1	13	44
-13	41	44	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141642	UNKNOWN	First post	13	41	Category #1	13	44
-13	43	45	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141651	UNKNOWN	First post	13	43	Category #0	13	45
-13	42	45	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141655	UNKNOWN	First post	13	42	Category #0	13	45
-13	41	45	1	""	2021-02-27 10:32:16.129860	Post #9	Anonymous Coward	13	2021-02-27 10:32:16.141642	UNKNOWN	First post	13	41	Category #0	13	45
+post_id	com_id	cat_id	body	title	comment_author	com_pubdate	spamp	com_text	cat_name
+4	16	44	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133969	HAM	First post	Category #1
+4	15	44	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133963	SPAM	First post!	Category #1
+4	14	44	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133870	UNKNOWN	First post!!	Category #1
+4	16	45	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133969	HAM	First post	Category #0
+4	15	45	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133963	SPAM	First post!	Category #0
+4	14	45	"foo"	Post #0	Anonymous Coward	2021-02-27 10:32:16.133870	UNKNOWN	First post!!	Category #0
+5	19	44	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135200	SPAM	Bah	Category #1
+5	18	44	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135192	SPAM	OK	Category #1
+5	17	44	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135205	UNKNOWN	Meh.	Category #1
+5	19	45	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135200	SPAM	Bah	Category #0
+5	18	45	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135192	SPAM	OK	Category #0
+5	17	45	"bar!"	Post #1	Anonymous Coward	2021-02-27 10:32:16.135205	UNKNOWN	Meh.	Category #0
 |===
-
+...
 
 [%notitle]
 === Fix: Sequential Fetch Queries
 
-[source,java]
+[source,java,linenums,highlight="|4-9|11-18|15,17"]
 ----
 @Transactional
 public List<Post> getAllWithCommentsAndCategories2() {
@@ -350,66 +271,10 @@
 ----
 
 
-//[%notitle]
-//== Update without `#persist`
-//
-//[source,java]
-//----
-//@Transactional
-//public void resetCommentStatus() {
-//
-//  List<Comment> comments = Comment.find(
-//      """
-//      SELECT c FROM Comment c
-//       WHERE c.spamStatus <> 'UNKNOWN'
-//      """)
-//      .list();
-//
-//  comments.forEach(c -> c.spamStatus = SpamStatus.UNKNOWN);
-//}
-//----
-//
-//
-//[%notitle]
-//=== Good SQL
-//
-//[source,sql]
-//----
-//select
-//    comment0_.id,
-//    comment0_.author_name,
-//    comment0_.post_id,
-//    comment0_.publication_date,
-//    comment0_.spam_status,
-//    comment0_.text
-//from
-//    comment comment0_
-//where
-//    comment0_.spam_status<>'UNKNOWN'
-//----
-//
-//[source,sql]
-//----
-//update
-//    comment
-//set
-//    author_name=?,
-//    post_id=?,
-//    publication_date=?,
-//    spam_status=?,
-//    text=?
-//where
-//    id=?
-//
-//update
-//...
-//----
-
-
 [%notitle]
 == First-Level Caching for the Win
 
-[source,java]
+[source,java,linenums,highlight="|4-9|11-12|14-17"]
 ----
 @Transactional
 public void updateCommentStatus() {
@@ -421,7 +286,8 @@
       """)
       .list();
 
-  var assessments = spamAssessmentService.assess(comments);   //<2>
+  Map<Long, SpamState> assessments =
+    spamAssessmentService.assess(comments);                   //<2>
 
   for (var assessment : assessments.entrySet()) {
     Comment comment = Comment.findById(assessment.getKey());  //<3>
@@ -541,7 +407,7 @@
 [%notitle]
 === Another Look at the Author
 
-[source,java]
+[source,java,linenums,highlight="|6,7"]
 ----
 @Entity
 public class Author extends PanacheEntity {
@@ -550,18 +416,18 @@
 
   @OneToOne(fetch = FetchType.LAZY,
             mappedBy = "author")
-  public BasicCredentials basicCredentials;  //<1>
+  public BasicCredentials basicCredentials;
 }
 ----
 
-[source,java]
+[source,java,linenums,highlight="0"]
 ----
 @Entity
 public class BasicCredentials extends PanacheEntity {
 
   @OneToOne(fetch = FetchType.LAZY)
   @MapsId
-  public Author author;                      //<2>
+  public Author author;
 
   public String username;
   public String password;
@@ -578,7 +444,7 @@
 [.columns]
 === Fix: `@LazyToOne(NO_PROXY)`
 
-[source,java,data-line-numbers=8]
+[source,java,linenums,highlight="8"]
 [.column]
 [.is-two-thirds]
 ----
@@ -599,6 +465,57 @@
 
 
 [%notitle]
+=== Fix: Bytecode Enhancement (Gradle)
+
+[source,groovy,linenums,highlight="5|11"]
+----
+apply plugin: 'org.hibernate.orm'
+
+buildscript {
+    dependencies {
+        classpath "org.hibernate:hibernate-gradle-plugin:$hibernateVersion"
+    }
+}
+
+hibernate {
+    enhance {
+        enableLazyInitialization = true
+        enableDirtyTracking = false
+        enableAssociationManagement = false
+    }
+}
+----
+
+[%notitle]
+=== Fix: Bytecode Enhancement (Maven)
+
+[source,xml,linenums,highlight="3|10"]
+----
+<plugin>
+    <groupId>org.hibernate.orm.tooling</groupId>
+    <artifactId>hibernate-enhance-maven-plugin</artifactId>
+    <version>${hibernate.version}</version>
+
+    <executions>
+        <execution>
+
+            <configuration>
+                <enableLazyInitialization>true</enableLazyInitialization>
+                <enableDirtyTracking>false</enableDirtyTracking>
+                <enableAssociationManagement>false</enableAssociationManagement>
+                <failOnError>true</failOnError>
+            </configuration>
+
+            <goals>
+                <goal>enhance</goal>
+            </goals>
+
+        </execution>
+    </executions>
+</plugin>
+----
+
+[%notitle]
 === Good SQL
 
 [source,sql]
@@ -618,8 +535,57 @@
         on post0_.author_id=author1_.id
 ----
 
+[%notitle.columns]
+== Projections
+
+[source,java]
+[.column.is-one-half]
+----
+public final class PostSummary {
+
+  public final String authorName;
+  public final String title;
+  public final Instant publicationDate;
+  public final int commentCount;
+
+  public PostSummary(
+      String authorName,
+      String title,
+      Instant pubDate,
+      int commentCount) {
+    this.authorName = authorName;
+    this.title = title;
+    this.publicationDate = pubDate;
+    this.commentCount = commentCount;
+  }
+}
+----
+
+[source,java]
+[.column.is-one-half]
+----
+@Transactional
+public List<PostSummary> overview() {
+
+  return Post.<Post>find(
+      """
+      SELECT p FROM Post p
+        LEFT JOIN FETCH p.author
+        LEFT JOIN FETCH p.comments
+      """)
+      .stream()
+      .map((Post p) ->
+          new PostSummary(
+              p.author.name,
+              p.title,
+              p.publicationDate,
+              p.comments.size()))
+      .collect(Collectors.toList());
+}
+----
+
 [%notitle]
-== Projection Queries
+=== Projection Queries
 
 [source,java]
 ----
@@ -639,32 +605,6 @@
 
 
 [%notitle]
-=== Projection DTOs
-
-[source,java]
-----
-public final class PostSummary {
-
-  public final String authorName;
-  public final String title;
-  public final Instant publicationDate;
-  public final int commentCount;
-
-  public PostSummary(                        //<1>
-      String authorName,
-      String title,
-      Instant publicationDate,
-      int commentCount) {
-    this.authorName = authorName;
-    this.title = title;
-    this.publicationDate = publicationDate;
-    this.commentCount = commentCount;
-  }
-}
-----
-
-
-[%notitle]
 === Good SQL
 
 [source,sql]
@@ -688,12 +628,12 @@
 ----
 
 
-[%notitle]
 == Conclusion
 
-- Lazy is good
-- Lazier is better
-- Lazy with bytecode enhancement is best
-- Sequential queries avoid cartesian blowup
-- The 1st-level cache is your friend
-- Use DTO projections everywhere all the time
+[%step]
+* Use a DTO projection if you can.
+* If not:
+[%step]
+** Check your ``@OneToOne``s.  Use `@LazyToOne` and bytecode enhancement if necessary.
+** Don't `LEFT JOIN FETCH` more than one collection at once.  Use sequential queries instead.
+** The 1st-level cache is your friend.  Use it.
diff --git a/blog/src/main/asciidoc/SLIDES.css b/blog/src/main/asciidoc/SLIDES.css
index b3e362e..22bdc1d 100644
--- a/blog/src/main/asciidoc/SLIDES.css
+++ b/blog/src/main/asciidoc/SLIDES.css
@@ -3,5 +3,5 @@
 }
 
 .supersmall {
-    font-size: x-small;
+    font-size: medium;
 }
diff --git a/blog/src/main/java/eu/mulk/demos/blog/posts/PostResource.java b/blog/src/main/java/eu/mulk/demos/blog/posts/PostResource.java
index ae8b4de..aced15b 100644
--- a/blog/src/main/java/eu/mulk/demos/blog/posts/PostResource.java
+++ b/blog/src/main/java/eu/mulk/demos/blog/posts/PostResource.java
@@ -6,6 +6,7 @@
 import eu.mulk.demos.blog.comments.SpamStatus;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -218,12 +219,38 @@
 
   /**
    * Fetches all posts with all the relevant info for an overview included.
+   *
+   * Bad version.
    */
   @GET
   @Transactional
   @Path("/q8")
   @Produces(MediaType.APPLICATION_JSON)
-  public List<PostSummary> overview() {
+  public List<PostSummary> overview1() {
+    clearLog();
+
+    return Post.find(
+        """
+            SELECT p FROM Post p
+              LEFT JOIN FETCH p.author
+              LEFT JOIN FETCH p.comments
+            """)
+        .<Post>stream()
+        .map((Post p) ->
+            new PostSummary(p.author.name, p.title, p.publicationDate, p.comments.size()))
+        .collect(Collectors.toList());
+  }
+
+  /**
+   * Fetches all posts with all the relevant info for an overview included.
+   *
+   * Good version.
+   */
+  @GET
+  @Transactional
+  @Path("/q9")
+  @Produces(MediaType.APPLICATION_JSON)
+  public List<PostSummary> overview2() {
     clearLog();
 
     return entityManager.createQuery(