보라코딩
스프링부트 맛집별 별점구현 (Join, SQL문) 본문
StoreVO
package com.tastemate.domain;
import lombok.Data;
import org.apache.ibatis.type.Alias;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Data
@Alias("StoreVO")
public class StoreVO {
private String storeIdx;
private String userIdx;
private String storeName;
private String category1;
private String storeAddress;
private double storeLati;
private double storeLongi;
private String phoneNumber;
private String storeCount;
private String filename;
private MultipartFile oriFilename;
// join
private List<MenuVO> menuVO;
// join
private StarVO starVO;
}
import lombok.Data;
import org.apache.ibatis.type.Alias;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Data
@Alias("StoreVO")
public class StoreVO {
private String storeIdx;
private String userIdx;
private String storeName;
private String category1;
private String storeAddress;
private double storeLati;
private double storeLongi;
private String phoneNumber;
private String storeCount;
private String filename;
private MultipartFile oriFilename;
// join
private List<MenuVO> menuVO;
// join
private StarVO starVO;
}
StarVO
별점 구현을 위해 starVO 테이블을 만들었다.
맛집 하나당 별점은 여러개이기에!
package com.tastemate.domain;
import lombok.Data;
import org.apache.ibatis.type.Alias;
@Data
@Alias("StarVO")
public class StarVO {
private int starIdx;
private int storeIdx;
private int userIdx;
private double storeStar;
private int userStar;
private String storeComment;
}
import lombok.Data;
import org.apache.ibatis.type.Alias;
@Data
@Alias("StarVO")
public class StarVO {
private int starIdx;
private int storeIdx;
private int userIdx;
private double storeStar;
private int userStar;
private String storeComment;
}
StoreMapper.xml
<resultMap id="storeStarResultMap" type="com.tastemate.domain.StoreVO">
<id column="STORE_IDX" property="storeIdx"/>
<result column="STORE_NAME" property="storeName"/>
<result column="CATEGORY1" property="category1"/>
<result column="STORE_ADDRESS" property="storeAddress"/>
<result column="STORE_LATI" property="storeLati"/>
<result column="STORE_LONGI" property="storeLongi"/>
<result column="PHONE_NUMBER" property="phoneNumber"/>
<result column="STORE_COUNT" property="storeCount"/>
<result column="FILENAME" property="filename"/>
<collection property="starVO" ofType="StarVO">
<id column="STORE_IDX" property="starIdx" />
<result column="STORE_IDX" property="storeIdx" />
<result column="USER_IDX" property="userIdx" />
<result column="STORE_STAR" property="storeStar" />
</collection>
</resultMap>
<id column="STORE_IDX" property="storeIdx"/>
<result column="STORE_NAME" property="storeName"/>
<result column="CATEGORY1" property="category1"/>
<result column="STORE_ADDRESS" property="storeAddress"/>
<result column="STORE_LATI" property="storeLati"/>
<result column="STORE_LONGI" property="storeLongi"/>
<result column="PHONE_NUMBER" property="phoneNumber"/>
<result column="STORE_COUNT" property="storeCount"/>
<result column="FILENAME" property="filename"/>
<collection property="starVO" ofType="StarVO">
<id column="STORE_IDX" property="starIdx" />
<result column="STORE_IDX" property="storeIdx" />
<result column="USER_IDX" property="userIdx" />
<result column="STORE_STAR" property="storeStar" />
</collection>
</resultMap>
별점을 여러명이 주니까 평균을 어떻게 구할까 고민했는데
SQL문으로 해결 가능했다.
<select id="store_getList_withStar" resultMap="storeStarResultMap">
<!--select * from store-->
SELECT s.store_idx, s.user_idx, s.store_name, s.category1, s.store_address,
s.store_lati, s.store_longi, s.phone_number, s.store_count, s.filename,
avg_star.STORE_STAR
FROM STORE s
LEFT OUTER JOIN (
SELECT store_idx, ROUND(AVG(store_star), 1) AS STORE_STAR
FROM STAR
GROUP BY store_idx
) avg_star ON s.store_idx = avg_star.store_idx
ORDER BY s.store_idx
</select>
<!--select * from store-->
SELECT s.store_idx, s.user_idx, s.store_name, s.category1, s.store_address,
s.store_lati, s.store_longi, s.phone_number, s.store_count, s.filename,
avg_star.STORE_STAR
FROM STORE s
LEFT OUTER JOIN (
SELECT store_idx, ROUND(AVG(store_star), 1) AS STORE_STAR
FROM STAR
GROUP BY store_idx
) avg_star ON s.store_idx = avg_star.store_idx
ORDER BY s.store_idx
</select>
참고로 별점 평균만 보고 싶다면
select store_idx, round(avg(store_star),1)
from star group by store_idx;
list.html
별점을 객체로 가져왔고
타임리프 사용해서
별점이 0.0이 아닌 경우에만 별을 표시하는데
each로 수만큼 별점을 표현하도록 했다.
<span th:text="${storeVO.starVO.storeStar}"></span>
<th:block th:with="starCount=${storeVO.starVO.storeStar}">
<span th:if="${starCount != 0.0}" th:each="i: ${#numbers.sequence(1, starCount)}" class="yellow">★</span>
</th:block>
<th:block th:with="starCount=${storeVO.starVO.storeStar}">
<span th:if="${starCount != 0.0}" th:each="i: ${#numbers.sequence(1, starCount)}" class="yellow">★</span>
</th:block>
참고로 별점 style은
.yellow {
color : #FFA500;
}
color : #FFA500;
}
이분 블로그 참고했는데
매우 글 잘 써놓으셨음!
[SQL] 사용자별 댓글 별점 평균 구하기
1. 댓글(REPLY) 테이블의 게시글 번호와, 별점 조회. SELECT PRODUCT_NO, REPLY_STAR FROM REPLY; 2. 게시글 번호의 평균 조회 (AVG, SUM등의 집계함수는 집계함수를 제외한 컬럼을 GROUP BY절로 묶어 주어야 한다.) SE
retrieverj.tistory.com
'코딩 > Spring' 카테고리의 다른 글
Day105_230526_스프링부트 카카오 페이 결제하기 (공부중...) (0) | 2023.05.26 |
---|---|
Day104_230525_ 프로젝트 진행사항(UI 위주) (0) | 2023.05.25 |
스프링부트 JOIN 하여 사용하기 (1:N) resultMap, collection 사용하기 (0) | 2023.05.24 |
TASTEMATE 맛집 진행사항 (0) | 2023.05.24 |
새창 띄우기 (자바스크립트 사용) (0) | 2023.05.24 |