package <%= fullDomainPackage %>.infrastructure import <%= pkg %>.domain.infrastructure.Repository import <%= pkg %>.extensions.findFirstOrNull import <%= pkg %>.extensions.getOffsetDateTime import <%= pkg %>.extensions.getUuid import <%= pkg %>.extensions.insertReturning import <%= pkg %>.extensions.updateReturning import <%= fullDomainPackage %>.<%= domain %> import io.micronaut.spring.tx.annotation.Transactional import org.apache.commons.lang3.StringUtils.EMPTY import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.jdbc.core.RowMapper import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate import java.sql.ResultSet import javax.inject.Inject import javax.inject.Singleton @Singleton class <%= domain %>Repository @Inject constructor( private val jdbc: NamedParameterJdbcTemplate ) : Repository<<%= domain %>> { private val logger: Logger = LoggerFactory.getLogger(<%= domain %>Repository::class.java) private val simple<%= domain %>RowMapper = <%= domain %>RowMapper() override fun findOne(id: Long): <%= domain %>? { val found = jdbc.findFirstOrNull("SELECT * FROM <%= table %> WHERE id = :id", mapOf("id" to id), simple<%= domain %>RowMapper) logger.trace("Searching for <%= domain %>: {} resulted in {}", id, found) return found } override fun exists(id: Long): Boolean { val exists = jdbc.queryForObject("SELECT EXISTS(SELECT id FROM <%= table %> WHERE id = :id)", mapOf("id" to id), Boolean::class.java)!! logger.trace("Checking if <%= domain %>: {} exists resulted in {}", id, exists) return exists } @Transactional override fun insert(entity: <%= domain %>): <%= domain %> { logger.debug("Inserting <%= table %> {}", entity) return jdbc.insertReturning(""" INSERT INTO <%= table %>() VALUES () RETURNING * """.trimIndent(), mapOf(), simple<%= domain %>RowMapper ) } @Transactional override fun update(entity: <%= domain %>): <%= domain %> { logger.debug("Updating <%= table %> {}", entity) return jdbc.updateReturning(""" UPDATE <%= table %> SET WHERE id = :id RETURNING * """.trimIndent(), mapOf( "id" to entity.id ), simple<%= domain %>RowMapper ) } } private class <%= domain %>RowMapper( private val columnPrefix: String = EMPTY ) : RowMapper<<%= domain %>> { override fun mapRow(rs: ResultSet, rowNum: Int): <%= domain %> = <%= domain %>( id = rs.getLong("${columnPrefix}id"), uuRowId = rs.getUuid("${columnPrefix}uu_row_id"), timeCreated = rs.getOffsetDateTime("${columnPrefix}time_created"), timeUpdated = rs.getOffsetDateTime("${columnPrefix}time_updated") ) }