[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao ...
Christian Bauer
christian at hibernate.org
Mon Jan 14 20:00:01 EST 2008
User: cbauer
Date: 08/01/14 20:00:01
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/dao
WikiNodeDAO.java TagDAO.java
Log:
Make ORDER BY in queries more typesafe
Revision Changes Path
1.8 +26 -16 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/WikiNodeDAO.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiNodeDAO.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/WikiNodeDAO.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- WikiNodeDAO.java 14 Jan 2008 05:10:47 -0000 1.7
+++ WikiNodeDAO.java 15 Jan 2008 01:00:01 -0000 1.8
@@ -105,17 +105,15 @@
return null;
}
- public List<WikiNode> findChildren(WikiNode node, String orderByProperty, boolean orderAscending, int firstResult, int maxResults) {
- // Sanitize input
- orderByProperty = orderByProperty.replaceAll("[^a-zA-Z0-9]", "");
+ public List<WikiNode> findChildren(WikiNode node, WikiNode.SortableProperty orderBy, boolean orderAscending, int firstResult, int maxResults) {
StringBuilder queryString = new StringBuilder();
queryString.append("select n from WikiNode n where n.parent = :parent").append(" ");
- queryString.append("order by n.").append(orderByProperty).append(" ").append(orderAscending ? "asc" : "desc");
+ queryString.append("order by n.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
return restrictedEntityManager
.createQuery(queryString.toString())
- .setHint("org.hibernate.comment", "Find wikinode children order by "+orderByProperty)
+ .setHint("org.hibernate.comment", "Find wikinode children order by "+orderBy.name())
.setParameter("parent", node)
.setHint("org.hibernate.cacheable", true)
.setFirstResult(firstResult)
@@ -311,8 +309,12 @@
return null;
}
- public List<WikiDocument> findWikiDocuments(WikiDirectory directory) {
- return restrictedEntityManager.createQuery("select d from WikiDocument d where d.parent = :dir order by d.createdOn asc")
+ public List<WikiDocument> findWikiDocuments(WikiDirectory directory, WikiNode.SortableProperty orderBy, boolean orderAscending) {
+
+ StringBuilder query = new StringBuilder();
+ query.append("select d from WikiDocument d where d.parent = :dir");
+ query.append(" order by d.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
+ return restrictedEntityManager.createQuery(query.toString())
.setParameter("dir", directory)
.setHint("org.hibernate.comment", "Find documents of directory")
.setHint("org.hibernate.cacheable", true)
@@ -338,23 +340,27 @@
return null;
}
- public List<WikiDocument> findWikiDocumentsOrderByLastModified(int maxResults) {
- //noinspection unchecked
+ public List<WikiDocument> findWikiDocuments(int maxResults, WikiNode.SortableProperty orderBy, boolean orderAscending) {
+
+ StringBuilder query = new StringBuilder();
+ query.append("select d from WikiDocument d where d.lastModifiedOn is not null");
+ query.append(" order by d.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
+
+
return (List<WikiDocument>)restrictedEntityManager
- .createQuery("select d from WikiDocument d where d.lastModifiedOn is not null order by d.lastModifiedOn desc")
- .setHint("org.hibernate.comment", "Find documents order by lastModified")
+ .createQuery(query.toString())
+ .setHint("org.hibernate.comment", "Find documents order by " + orderBy.name())
.setHint("org.hibernate.cacheable", true)
.setMaxResults(maxResults)
.getResultList();
}
- public WikiDocument findSiblingWikiDocumentInDirectory(WikiDocument currentDocument, String byProperty, boolean previousOrNext) {
- byProperty = byProperty.replaceAll("[^\\p{Alnum}]+", ""); // Avoid SQL injection hole!
+ public WikiDocument findSiblingWikiDocumentInDirectory(WikiDocument currentDocument, WikiNode.SortableProperty byProperty, boolean previousOrNext) {
try {
return (WikiDocument)restrictedEntityManager
.createQuery("select sibling from WikiDocument sibling, WikiDocument current" +
" where sibling.parent = current.parent and current = :current and not sibling = :current" +
- " and sibling."+ byProperty + " " + (previousOrNext ? "<=" : ">=") + "current."+byProperty +
+ " and sibling."+ byProperty.name() + " " + (previousOrNext ? "<=" : ">=") + "current."+ byProperty.name() +
" order by sibling." +byProperty + " " + (previousOrNext ? "desc" : "asc") )
.setHint("org.hibernate.cacheable", true)
.setMaxResults(1)
@@ -380,8 +386,12 @@
return null;
}
- public List<WikiUpload> findWikiUploads(WikiDirectory directory) {
- return restrictedEntityManager.createQuery("select u from WikiUpload u where u.parent = :dir order by u.createdOn asc")
+ public List<WikiUpload> findWikiUploads(WikiDirectory directory, WikiNode.SortableProperty orderBy, boolean orderAscending) {
+ StringBuilder query = new StringBuilder();
+ query.append("select u from WikiUpload u where u.parent = :dir");
+ query.append(" order by u.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
+
+ return restrictedEntityManager.createQuery(query.toString())
.setParameter("dir", directory)
.setHint("org.hibernate.comment", "Find uploads of directory")
.setHint("org.hibernate.cacheable", true)
1.4 +4 -2 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/TagDAO.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: TagDAO.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/TagDAO.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- TagDAO.java 19 Dec 2007 04:29:26 -0000 1.3
+++ TagDAO.java 15 Jan 2008 01:00:01 -0000 1.4
@@ -11,6 +11,7 @@
import org.jboss.seam.wiki.core.model.DisplayTagCount;
import org.jboss.seam.wiki.core.model.WikiDirectory;
import org.jboss.seam.wiki.core.model.WikiFile;
+import org.jboss.seam.wiki.core.model.WikiNode;
import org.jboss.seam.wiki.core.nestedset.query.NestedSetQueryBuilder;
import javax.persistence.EntityManager;
@@ -54,7 +55,8 @@
return nestedSetQuery.list();
}
- public List<WikiFile> findWikFiles(WikiDirectory startDir, WikiFile ignoreFile, final String tag) {
+ public List<WikiFile> findWikFiles(WikiDirectory startDir, WikiFile ignoreFile, final String tag,
+ WikiNode.SortableProperty orderBy, boolean orderAscending) {
if (tag == null || tag.length() == 0) return Collections.emptyList();
@@ -64,7 +66,7 @@
queryString.append("(").append(getNestedDirectoryQuery(startDir)).append(")").append(" ");
if (ignoreFile != null && ignoreFile.getId() != null) queryString.append("and not f = :ignoreFile").append(" ");
queryString.append("and t = :tag").append(" ");
- queryString.append("order by f.createdOn desc");
+ queryString.append("order by f.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
Query nestedSetQuery = getSession().createQuery(queryString.toString());
nestedSetQuery.setParameter("nsThread", startDir.getNodeInfo().getNsThread());
More information about the jboss-cvs-commits
mailing list