From b7860382c9dd475d60fbdcb00b01d45ad12d2a2c Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Thu, 21 Apr 2011 13:00:06 -0400 Subject: [PATCH] DATAJDBC-6 added count, countDistinct, exists, notExists methods to QueryDslJdbcOperations --- .../jdbc/query/QueryDslJdbcOperations.java | 8 ++++ .../data/jdbc/query/QueryDslJdbcTemplate.java | 40 +++++++++++++++++++ .../data/jdbc/query/CustomerDao.java | 8 ++++ .../data/jdbc/query/CustomerDaoTest.java | 32 +++++++++++++++ .../data/jdbc/query/QueryDslCustomerDao.java | 31 ++++++++++++++ 5 files changed, 119 insertions(+) diff --git a/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcOperations.java b/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcOperations.java index 422a1ec..85e241a 100644 --- a/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcOperations.java +++ b/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcOperations.java @@ -19,6 +19,14 @@ public interface QueryDslJdbcOperations { JdbcOperations getJdbcOperations(); SQLQuery newSqlQuery(); + + long count(final SQLQuery sqlQuery); + + long countDistinct(final SQLQuery sqlQuery); + + boolean exists(final SQLQuery sqlQuery); + + boolean notExists(final SQLQuery sqlQuery); T queryForObject(final SQLQuery sqlQuery, final RowMapper rowMapper, final Expression... cols); diff --git a/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcTemplate.java b/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcTemplate.java index 1bfea9f..9eb915f 100644 --- a/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcTemplate.java +++ b/spring-data-jdbc-core/src/main/java/org/springframework/data/jdbc/query/QueryDslJdbcTemplate.java @@ -89,6 +89,46 @@ public SQLQuery newSqlQuery() { return new SQLQueryImpl(this.dialect); } + public long count(final SQLQuery sqlQuery) { + long count = jdbcTemplate.execute(new ConnectionCallback() { + public Long doInConnection(Connection con) throws SQLException, + DataAccessException { + SQLQuery liveQuery = sqlQuery.clone(con); + return liveQuery.count(); + }}); + return count; + } + + public long countDistinct(final SQLQuery sqlQuery) { + long count = jdbcTemplate.execute(new ConnectionCallback() { + public Long doInConnection(Connection con) throws SQLException, + DataAccessException { + SQLQuery liveQuery = sqlQuery.clone(con); + return liveQuery.countDistinct(); + }}); + return count; + } + + public boolean exists(final SQLQuery sqlQuery) { + boolean exists = jdbcTemplate.execute(new ConnectionCallback() { + public Boolean doInConnection(Connection con) throws SQLException, + DataAccessException { + SQLQuery liveQuery = sqlQuery.clone(con); + return liveQuery.exists(); + }}); + return exists; + } + + public boolean notExists(final SQLQuery sqlQuery) { + boolean notExists = jdbcTemplate.execute(new ConnectionCallback() { + public Boolean doInConnection(Connection con) throws SQLException, + DataAccessException { + SQLQuery liveQuery = sqlQuery.clone(con); + return liveQuery.notExists(); + }}); + return notExists; + } + public T queryForObject(final SQLQuery sqlQuery, final RowMapper rowMapper, final Expression... projection) { List results = query(sqlQuery, rowMapper, projection); if (results.size() == 0) { diff --git a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDao.java b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDao.java index b07f9b5..352d58c 100644 --- a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDao.java +++ b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDao.java @@ -15,5 +15,13 @@ public interface CustomerDao { Customer findById(Long id); List findAll(); + + long countCustomers(); + + long countDistinctForLastName(String name); + + boolean customerExists(Long id); + + boolean customerExists(Customer c); } diff --git a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDaoTest.java b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDaoTest.java index 32b6f89..6f99dc4 100644 --- a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDaoTest.java +++ b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/CustomerDaoTest.java @@ -75,4 +75,36 @@ public void testDelete() { Assert.assertEquals(1, customers.size()); } + @Test + public void testCountCustomer() { + Customer c = new Customer(); + c.setFirstName("Oliver"); + c.setLastName("Gierke"); + customerDao.add(c); + long count = customerDao.countCustomers(); + Assert.assertEquals(3, count); + } + + @Test + public void testCountDistinctCustomer() { + Customer c = new Customer(); + c.setFirstName("Mark2"); + c.setLastName("Pollack"); + customerDao.add(c); + long count = customerDao.countDistinctForLastName(c.getLastName()); + Assert.assertEquals(2, count); + } + + @Test + public void testCustomerExists() { + Customer c = customerDao.findById(1L); + boolean exists = customerDao.customerExists(c); + Assert.assertTrue(exists); + } + + @Test + public void testCustomerNotExists() { + boolean exists = customerDao.customerExists(99L); + Assert.assertFalse(exists); + } } diff --git a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/QueryDslCustomerDao.java b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/QueryDslCustomerDao.java index b806126..37be5bf 100644 --- a/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/QueryDslCustomerDao.java +++ b/spring-data-jdbc-core/src/test/java/org/springframework/data/jdbc/query/QueryDslCustomerDao.java @@ -80,5 +80,36 @@ public long doInSqlDeleteClause(SQLDeleteClause sqlDeleteClause) { }); } + @Override + public long countCustomers() { + SQLQuery sqlQuery = template.newSqlQuery() + .from(qCustomer); + return template.count(sqlQuery); + } + + @Override + public long countDistinctForLastName(String name) { + SQLQuery sqlQuery = template.newSqlQuery() + .from(qCustomer) + .where(qCustomer.lastName.eq(name)); + return template.countDistinct(sqlQuery); + } + + @Override + public boolean customerExists(Long id) { + SQLQuery sqlQuery = template.newSqlQuery() + .from(qCustomer) + .where(qCustomer.id.eq(id)); + return !template.notExists(sqlQuery); + } + + @Override + public boolean customerExists(Customer c) { + SQLQuery sqlQuery = template.newSqlQuery() + .from(qCustomer) + .where(qCustomer.id.eq(c.getId())); + return template.exists(sqlQuery); + } + }