/*
* Copyright (c) 2023. yo-saito. All Rights Reserved.
*/
package net.piedpiper.bremer.dao
import net.piedpiper.bremer.entity.AlbumEntity
import net.piedpiper.bremer.entity.AudioEntity
import net.piedpiper.bremer.entity.AudioPlayHistoryEntity
import net.piedpiper.bremer.utils.DaoUtils
import net.piedpiper.bremer.utils.SelectSQLBuilder
import net.piedpiper.bremer.utils.WHERE_LIKES
import org.apache.ibatis.annotations.*
import org.apache.ibatis.jdbc.SelectBuilder
import org.springframework.stereotype.Repository
@Repository("bremer.dao.AlbumDao")
@Mapper
interface AlbumDao {
@ResultMap("net.piedpiper.bremer.AlbumEntity")
@Select("SELECT * FROM album WHERE id = #{id} FOR UPDATE")
fun findOneByIdWithLock(@Param("id") id: Long): AlbumEntity?
@ResultMap("net.piedpiper.bremer.AlbumEntity")
@Select(
"""<script>
SELECT * FROM album WHERE artist_id IN
<foreach item="artistId" collection="artistIds" open="(" separator="," close=")">
#{artistId}
</foreach>
LIMIT #{limit}
</script>"""
)
fun findAllByArtistIdInLimit(
@Param("artistIds") artistIds: List<Long>,
@Param("limit") limit: Int
): List<AlbumEntity>
@ResultMap("net.piedpiper.bremer.AlbumEntity")
@SelectProvider(type = Sql::class, method = "findAllByNamesLikeLimit")
fun findAllByNamesLikeLimit(
@Param("namesLike") namesLike: List<String>,
@Param("limit") limit: Int
): List<AlbumEntity>
@UpdateProvider(type = Sql::class, method = "updateOne")
fun updateOne(@Param("entity") entity: AlbumEntity)
class Sql {
companion object {
@JvmStatic
fun updateOne(@Param("entity") entity: AlbumEntity): String =
DaoUtils.updateOne(entity)
@JvmStatic
fun findAllByNamesLikeLimit(
@Param("namesLike") namesLike: List<String>,
): String = SelectSQLBuilder(AlbumEntity::class)
.toSql()
.WHERE_LIKES("name", "namesLike", namesLike.size)
.LIMIT("#{limit}")
.toString()
}
}
}