From 5e35060d5351abe9e290cb04f869f5345ebfddd5 Mon Sep 17 00:00:00 2001 From: Chantha Date: Sun, 17 May 2020 12:25:24 +0700 Subject: [PATCH] Map Customer JPA API --- .idea/workspace.xml | 84 ++++++++---------- .../jdbc/controller/CustomerController.kt | 7 +- .../jpa/model/view/CustomerOrderView.java | 49 ++++++++++ .../chantha/jdbc/jpa/model/view/OrderView.kt | 13 +++ .../chantha/jdbc/jpa/repo/CustomerRepo.java | 11 +-- .../jpa/service/customer/CustomerService.java | 8 +- .../service/customer/CustomerServiceImpl.java | 62 ------------- .../service/customer/CustomerServiceImpl.kt | 51 +++++++++++ .../jdbc/controller/CustomerController.class | Bin 1809 -> 1739 bytes .../jpa/model/view/CustomerOrderView.class | Bin 0 -> 1751 bytes .../jdbc/jpa/model/view/OrderView.class | Bin 0 -> 2332 bytes .../chantha/jdbc/jpa/repo/CustomerRepo.class | Bin 773 -> 650 bytes .../service/customer/CustomerService.class | Bin 195 -> 379 bytes .../customer/CustomerServiceImpl.class | Bin 3219 -> 4925 bytes 14 files changed, 162 insertions(+), 123 deletions(-) create mode 100644 src/main/kotlin/com/chantha/jdbc/jpa/model/view/CustomerOrderView.java create mode 100644 src/main/kotlin/com/chantha/jdbc/jpa/model/view/OrderView.kt delete mode 100644 src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.java create mode 100644 src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.kt create mode 100644 target/classes/com/chantha/jdbc/jpa/model/view/CustomerOrderView.class create mode 100644 target/classes/com/chantha/jdbc/jpa/model/view/OrderView.class diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f2a6d9d..2f9d634 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,32 +2,15 @@ - - - + + + - - - - - - - - - - + + - - - - - - - - - - + @@ -67,7 +50,7 @@ - + @@ -102,7 +85,8 @@ - + + @@ -118,10 +102,14 @@ - + - + + + + + @@ -130,49 +118,49 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + \ No newline at end of file diff --git a/src/main/kotlin/com/chantha/jdbc/controller/CustomerController.kt b/src/main/kotlin/com/chantha/jdbc/controller/CustomerController.kt index db576c3..45328ef 100644 --- a/src/main/kotlin/com/chantha/jdbc/controller/CustomerController.kt +++ b/src/main/kotlin/com/chantha/jdbc/controller/CustomerController.kt @@ -2,6 +2,8 @@ package com.chantha.jdbc.controller import com.chantha.jdbc.jpa.model.Customer import com.chantha.jdbc.jpa.model.Order +import com.chantha.jdbc.jpa.model.view.CustomerOrderView +import com.chantha.jdbc.jpa.repo.CustomerRepo import com.chantha.jdbc.jpa.service.customer.CustomerService import com.chantha.jdbc.jpa.view.ViewsInvoice import org.apache.tomcat.util.json.JSONParser @@ -14,8 +16,9 @@ import org.springframework.web.bind.annotation.RestController @RestController class CustomerController @Autowired constructor(private val customerService: CustomerService) { + @GetMapping("/customer") - fun customer():List{ - return customerService.findAll().toList() + fun customer():List{ + return customerService.fetchAllCustomerOrder() } } \ No newline at end of file diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/model/view/CustomerOrderView.java b/src/main/kotlin/com/chantha/jdbc/jpa/model/view/CustomerOrderView.java new file mode 100644 index 0000000..f40c8a4 --- /dev/null +++ b/src/main/kotlin/com/chantha/jdbc/jpa/model/view/CustomerOrderView.java @@ -0,0 +1,49 @@ +package com.chantha.jdbc.jpa.model.view; + +import com.chantha.jdbc.jpa.model.Gender; +import com.chantha.jdbc.jpa.model.Order; + +import java.util.Date; +import java.util.List; + +public class CustomerOrderView { + public Long getCusID() { + return cusID; + } + + public void setCusID(Long cusID) { + this.cusID = cusID; + } + + public String getCusName() { + return cusName; + } + + public void setCusName(String cusName) { + this.cusName = cusName; + } + + public Gender getGender() { + return gender; + } + + public void setGender(Gender gender) { + this.gender = gender; + } + + public List getOrderList() { + return orderList; + } + + public void setOrderList(List orderList) { + this.orderList = orderList; + } + + private Long cusID; + private String cusName; + private Gender gender; + + private List orderList; + + +} diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/model/view/OrderView.kt b/src/main/kotlin/com/chantha/jdbc/jpa/model/view/OrderView.kt new file mode 100644 index 0000000..4dd0556 --- /dev/null +++ b/src/main/kotlin/com/chantha/jdbc/jpa/model/view/OrderView.kt @@ -0,0 +1,13 @@ +package com.chantha.jdbc.jpa.model.view + +import com.chantha.jdbc.utils.CustomDateSerializer +import com.fasterxml.jackson.annotation.JsonFormat +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import java.util.* + +open class OrderView{ + var orderId:Long ?= 0 + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MMM-dd HH:mm:ss ") + var orderDate:Date ? = Calendar.getInstance().time + var amount:Double ? = 0.0 +} \ No newline at end of file diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/repo/CustomerRepo.java b/src/main/kotlin/com/chantha/jdbc/jpa/repo/CustomerRepo.java index 236acac..fed4a2a 100644 --- a/src/main/kotlin/com/chantha/jdbc/jpa/repo/CustomerRepo.java +++ b/src/main/kotlin/com/chantha/jdbc/jpa/repo/CustomerRepo.java @@ -5,16 +5,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; public interface CustomerRepo extends CrudRepository { - @Query(value = "SELECT *\n" + - " FROM tb_order o\n" + - " INNER JOIN order_detail od\n" + - " ON (o.order_id=od.order_id)\n" + - " INNER JOIN tb_customer c\n" + - " ON (o.cus_id=c.id)\n" + - " INNER JOIN product pro\n" + - " ON (pro.product_id=od.product_id)\n" + - "\n" + - "\t\t",nativeQuery = true) + @Query(value ="SELECT * FROM tb_customer c INNER JOIN tb_order o ON (c.id=o.cus_id)",nativeQuery = true) @Override Iterable findAll(); } diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerService.java b/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerService.java index 08aa06d..ba493d0 100644 --- a/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerService.java +++ b/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerService.java @@ -1,6 +1,12 @@ package com.chantha.jdbc.jpa.service.customer; +import com.chantha.jdbc.jpa.model.view.CustomerOrderView; import com.chantha.jdbc.jpa.repo.CustomerRepo; +import org.springframework.stereotype.Service; -public interface CustomerService extends CustomerRepo { +import java.util.List; + +@Service +public interface CustomerService { + List fetchAllCustomerOrder(); } diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.java b/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.java deleted file mode 100644 index 6a05698..0000000 --- a/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.chantha.jdbc.jpa.service.customer; - -import com.chantha.jdbc.jpa.model.Customer; - -import java.util.Optional; - -public class CustomerServiceImpl implements CustomerService { - @Override - public S save(S s) { - return null; - } - - @Override - public Iterable saveAll(Iterable iterable) { - return null; - } - - @Override - public Optional findById(Long aLong) { - return Optional.empty(); - } - - @Override - public boolean existsById(Long aLong) { - return false; - } - - @Override - public Iterable findAll() { - return null; - } - - @Override - public Iterable findAllById(Iterable iterable) { - return null; - } - - @Override - public long count() { - return 0; - } - - @Override - public void deleteById(Long aLong) { - - } - - @Override - public void delete(Customer customer) { - - } - - @Override - public void deleteAll(Iterable iterable) { - - } - - @Override - public void deleteAll() { - - } -} diff --git a/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.kt b/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.kt new file mode 100644 index 0000000..f3c6db3 --- /dev/null +++ b/src/main/kotlin/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.kt @@ -0,0 +1,51 @@ +package com.chantha.jdbc.jpa.service.customer + + +import com.chantha.jdbc.jpa.model.Customer +import com.chantha.jdbc.jpa.model.Order +import com.chantha.jdbc.jpa.model.view.CustomerOrderView +import com.chantha.jdbc.jpa.model.view.OrderDetailView +import com.chantha.jdbc.jpa.model.view.OrderView +import com.chantha.jdbc.jpa.repo.CustomerRepo +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class CustomerServiceImpl @Autowired constructor(private val customerRepo: CustomerRepo) : CustomerService { + override fun fetchAllCustomerOrder(): List { + return customerRepo.findAll().map { toView(it) } + } + + private fun toView(data:Customer):CustomerOrderView{ + val view=CustomerOrderView() + view.cusID=data.id + view.cusName=data.cusName + view.gender=data.gender + view.orderList=data.orders.map { toCustomerOrderView(it) } + return view + } + + private fun toCustomerOrderView(data:Order):OrderView{ + val view=OrderView() + view.orderId=data.orderId + view.orderDate=data.orderDate + view.amount=data.amount + return view + } + +// private fun toView(data: Product): ProductWithOrderDetail { +// val view = ProductWithOrderDetail() +// view.productId = data.productId +// view.productName = data.productName +// view.details = data.orderDetails.map { toOrderDetailView(it) } +// return view +// } +// +// private fun toOrderDetailView(data: OrderDetail): OrderDetailView { +// val view = OrderDetailView() +// view.orderDetailId = data.orderDetailId +// view.price = data.price +// view.qty = data.qty +// return view +// } +} \ No newline at end of file diff --git a/target/classes/com/chantha/jdbc/controller/CustomerController.class b/target/classes/com/chantha/jdbc/controller/CustomerController.class index 029bd2677325bcb735588856f902904f96b44050..32f6bf18cc48942adc374f8325d6829520d1712a 100644 GIT binary patch delta 549 zcmZusNlF7j6n&M>obJ#@ZQ~S;W75%%^E@RA5>Q+Sf&^Ew#Xv;t(zwhSLSMs$5yfHQ z0d()e6L?5L(8@*gI=y+t zFVD|RYtK41tpieOUp}_meqvr0PBW#_zqE{2_(F)FjbXIVXxulga$7U(rd{O(u z{asn4uPs3WBUJT!sLyC;IE-{Wq4$0M%%?{Imd5{rn(5#RHQQagc1D_Nj>!dwMOEfp%*Q}P^%X=454=IQ2SPpc?VF*fLI)@2Nl8PzujcLr} V5#Z?KnB`D7!W?l9ub^`r^S`F8Uh@C| delta 627 zcmZutO;giQ6g@XBZ3%776s(|#C{oi_8&v#21i^w@?2Z{{oUTHQHX4$dz6aa>hE9Hj z8yDi>SY5btqd&lZ;<$3WdCkbinY?@Mx$oY4PTr5gps0WU^W`gmWwZwRTUr@>Xylp) zLWcWp@90;ScCs(M;Kioz6Ut__{n|dXE#D4aSuN@I>^DcirBh z=eUhz*sSJoCfd;!XeJ7@cK;k^b)3a{!u*?1`d(l;q3^qn^uj<`&6E78%;EweBg3{Q zB%xyd&qCtsKzhCv_pzsoxTIqq3xu@ndV;XjcEWwj>DqzpMnAQ0)Af;utAvzUeU`@+ zG<2k4MaQXkv>4gx*?$iaMd{!D4SuCHq(F?5wPP5cQ6@YuO%E|Q#O3!~*09MjGit#@ z&htsWhzhf&>d9e?vB)>$eDn@TU;^7*izoAp#AZzPvcdTlZ`Bz4M!i%U;#%z!mTL8n zFpju*BACG`C0JI?21bH_fr65XCFAu~#z%azlxRI>GDh4LZ+oKR17&cR`55!-9B*{6 tooeBx`j&C4gAu#k!X4b@Dpu5Q+{0=I;{p|d`vL`lqJSxoQFKjU{Vy?(bfN$N diff --git a/target/classes/com/chantha/jdbc/jpa/model/view/CustomerOrderView.class b/target/classes/com/chantha/jdbc/jpa/model/view/CustomerOrderView.class new file mode 100644 index 0000000000000000000000000000000000000000..435b3323a72a46cb2a7301d4dd9d01e73ea188b1 GIT binary patch literal 1751 zcmb7DT~8B16g{*3qRUEwLP1eM5on9DBIrvIO)wgh3M3fbx7$g(O}k6BTa5oo6O4%u z{s4cJ@y<-UZI=b%WoGu?JLjCe=gyzMzkUPQ#VZ{dm|3LpTrAsSc_Ega40bbk$&j*p z-H-1WrmHRM+%nsi+c2x1+o&*PD0OIcIK%8n@+9ybnNByjTjxH*YSs2SrrosMplO+{ zdd)UlXO`LV>bz}!kVS-+^?a(XI^7^7>jh5R6cLd=aT=}_^n9Xwt?0t^-gN}$4*y~v z3G7okRrU!hz2~@2u+NYvmQERx2c(1{S9M%|*z44||JkawnMpTbB)zHo`LKXNXr3QVP{Ei@%-?Y<}BsQdoXFdV#Hz2&AZtL!qyYnW3``-%uzgMc zLA+PBE% z$=J(FxK9ej<$c;U+SBFDAJB%>x{T(KBE^EfpsM=xLYnwbh6j{O(UYT%;USh|G$o>% z^0As$sEaY05>ZVHq-pUAO`_+aCS7WJjMW%T$*88KSWQo`7N;p0)wE2SR<6(_{0}u5 zQqwv%`mjUeFOZ6AT8+^(O#m8-gjhlu3F+Z6MM4i#LR$i2e3XY9q^)>`HZ_x*RIA1- VO^;$`sCJ4Hits4~pV60wt$!T_QqTYZ literal 0 HcmV?d00001 diff --git a/target/classes/com/chantha/jdbc/jpa/model/view/OrderView.class b/target/classes/com/chantha/jdbc/jpa/model/view/OrderView.class new file mode 100644 index 0000000000000000000000000000000000000000..92b0487b17f189cfaabb7237de4ee96476155336 GIT binary patch literal 2332 zcmb7FT~ixX7=F%@&n1LS_$W}IfY63uSfo`eU|R~M1OrsSNJTFW$rd(jc9}gJtTSG4 zrT@bV$4i|l%6Q>0T>7IN-?K>|WYVc-l5@^`&U4=PdB0Bn{^!rX06f4q43hgCtSCAeee!c)l&ECYhRSRun@J zp(qrn3<2-Z6bw_j|4d#Q5Df;pQqB4&^W?_@VKR>&F+_cjmbqtK`Bd>tOP4#OE8|;! z#f4|MugjKR;)NsO*bTnvYb38YZkc<84~j#6OsekxpL^rm@)F$+ZSQPlH=Yx}WA2ef zo1y1B`efGE*E7Z9$m;4`xjZMt2t%wM#VYlyI9`*FA%Ucf<84CMLsCW8gK`a)K?(7) zQ?WftN<+w&ok}%rQ8Kt#19acWS`8Az9gIkO?@?6AULD-in1LGBH@9Hgrbj7gOHJlu zxQCRA045pYH!CZQDGJC5w<^ZwD~7JrT8om&U|Pld(22Z%+xKjVTZUcaZWtdhv=jfV zEj(@)C_lY*4{iYGW4Mn8DrWH^LF(718*Zj1BlwtM_{i}r)7DETW!Kf{ajGg2xd_orKe-tRk{p$Cq_^+lbXJ*R zPlJ~~g%nNM8rIqd0)1>IuzUGKoc1&c9SB5%T4*c~32Tw95l!_G?GHmwLc5ngN>p6E zI3-X_>mX2E>m)Ur4@xws=_N!`>mo$A)^qtw=$2$V%g7xBZjY@gnaChYECR@iTa4XMUQ_8i?@n$4XL6}Moln3jQ2YOR1w1kLn9l2>1lBAitKh8^R!OV zUKg#q4fLQFw*>l{u+*td_rr8Q0@=P_k_MelDR2m;-=O_hU;QqP(ijNzlEzpSKywF4 zjZ_kdqmyV#MRTN3p*fVEIz#(!v{KNlske%#X_8hn-_lov4oe==zdiZ|sn}^spdSNt zrdRq7%5=is*PV(W<6aL}kL? zMwA{Sr085mbdQQmW_cq02h!>2Ic6wv>2rMaGWqZvkABDE83xnwbF7@9!F`5%jNwxIm{sNMQS4#5djL literal 0 HcmV?d00001 diff --git a/target/classes/com/chantha/jdbc/jpa/repo/CustomerRepo.class b/target/classes/com/chantha/jdbc/jpa/repo/CustomerRepo.class index b3a60a70c9eba91441bf3df6f9303769613c6c9e..5e01a1cf0ad58b8619a5dc1e663ba1d4af2ab3cd 100644 GIT binary patch delta 81 zcmZo=>tda7%he^=)yLI2L_tfzEy&+jp(H6jxwN<>KR2~VAz8uG&(AeT!OP#%4- ms=S~mKczIeL;*-c6ayK0P(hFupgjnlCKnec=Vp1vY(@Z`=Rs)z diff --git a/target/classes/com/chantha/jdbc/jpa/service/customer/CustomerService.class b/target/classes/com/chantha/jdbc/jpa/service/customer/CustomerService.class index 826b6f510486c0c2935cf4b962c1b9bcddad22fb..95d5e9223268a502e50fffa3d4b764897b34ad03 100644 GIT binary patch literal 379 zcmZutO-sW-5S^_xu~k7t5B`ICaV~nQ2t}}$K*2)qo6R)YxY-T6lNSG)2Y-M+N?dCc zL=VG!zxQ}=?=PuXuY=O+RKKv&Oc#b^5porCG4Rh z)y=;O!xt5*-hv;U{iA@BofSsf5*K+*iW30>2GL3YF%+-|!`Sb~ZU9M)bXOg~DCQ(? G#sD9dByrpT delta 80 zcmey(beK{2)W2Q(7#J8#7&zG(*w`7^*%>${PF9=5=*i5;pf;J2QB<=iwIE;LxwN<> dKR2}~2*_b$WME`q0%B&MMg}0w0wkFjSOFX)4~75$ diff --git a/target/classes/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.class b/target/classes/com/chantha/jdbc/jpa/service/customer/CustomerServiceImpl.class index 88c7c17f737be1168c3f06f85ce5286ed48e9cfc..8bc142f410085b0b7650a548c4d4a1d222114153 100644 GIT binary patch literal 4925 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