Created
May 5, 2019 12:56
-
-
Save orekyuu/8e356742f29c8726a3a6ed28c8f0c5a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.orekyuu.ktmapperdomasample.infrastructure.datasource | |
import net.orekyuu.ktmapper.mapping | |
import net.orekyuu.ktmapperdomasample.domain.identity.User | |
import net.orekyuu.ktmapperdomasample.domain.identity.UserId | |
import net.orekyuu.ktmapperdomasample.domain.identity.UserName | |
import net.orekyuu.ktmapperdomasample.domain.item.Item | |
import net.orekyuu.ktmapperdomasample.domain.item.ItemId | |
import net.orekyuu.ktmapperdomasample.domain.item.ItemName | |
import net.orekyuu.ktmapperdomasample.domain.item.Price | |
import net.orekyuu.ktmapperdomasample.domain.receipt.* | |
import org.seasar.doma.Column | |
import org.seasar.doma.Dao | |
import org.seasar.doma.Entity | |
import org.seasar.doma.Select | |
import org.seasar.doma.boot.ConfigAutowireable | |
import org.seasar.doma.experimental.Sql | |
import org.springframework.stereotype.Repository | |
@Entity(immutable = true) | |
data class ReceiptEntity( | |
@Column(name = "receipts.id") | |
val id: ReceiptId, | |
@Column(name = "receipts.settlement_at") | |
val settlementTime: SettlementTime, | |
@Column(name = "buyer.id") | |
val buyerId: UserId, | |
@Column(name = "buyer.name") | |
val buyerName: UserName, | |
@Column(name = "seller.id") | |
val sellerId: UserId, | |
@Column(name = "seller.name") | |
val sellerName: UserName, | |
@Column(name = "line_items.item_id") | |
val liItemId: ItemId, | |
@Column(name = "line_items.receipts_id") | |
val liReceiptId: ReceiptId, | |
@Column(name = "line_items.quantity") | |
val quantity: ItemQuantity, | |
@Column(name = "items.price") | |
val price: Price, | |
@Column(name = "items.name") | |
val itemName: ItemName | |
) | |
val receiptMapper = mapping<ReceiptEntity, Receipt> { | |
primaryKey { it.id } | |
val buyerRef = hasOne<User> { | |
attribute { User(it.buyerId, it.buyerName) } | |
} | |
val sellerRef = hasOne<User> { | |
attribute { User(it.sellerId, it.sellerName) } | |
} | |
val lineItemRef = hasMany<LineItem> { | |
primaryKey { Pair(it.liItemId, it.liReceiptId) } | |
val itemRef = hasOne<Item> { | |
attribute { Item(it.liItemId, it.price, it.itemName) } | |
} | |
attribute { LineItem(findOne(itemRef, it)!!, it.quantity) } | |
} | |
attribute { | |
Receipt(it.id, it.settlementTime, findChild(lineItemRef, it), findOne(buyerRef, it)!!, findOne(sellerRef, it)!!) | |
} | |
} | |
@Dao | |
@ConfigAutowireable | |
interface ReceiptDao { | |
@Sql(""" | |
select /*%expand*/* from receipts | |
join line_items on receipts.id = line_items.receipt_id | |
join items on line_items.item_id = items.id | |
join users buyer on receipts.buyer = buyer.id | |
join users seller on receipts.seller = seller.id | |
where buyer = /*buyerId*/1 | |
""") | |
@Select | |
fun findByBuyer(buyerId: UserId): List<ReceiptEntity> | |
} | |
@Repository | |
class ReceiptDataSource(val dao: ReceiptDao) : ReceiptRepository{ | |
override fun findByBuyer(buyerId: UserId): List<Receipt> { | |
return receiptMapper.toList(dao.findByBuyer(buyerId)) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment