๋ค์๊ณผ ๊ฐ์ดํ๋ค.
์ฐธ์กฐ : https://stackoverflow.com/questions/10230680/criteria-query-search-for-integer-using-like
predicates.add(criteriaBuilder.like(orderRoot.get(sKey).as(String.class), "%"+""+sWords+""+"%"));
serialize ๋ฅผ ๊ตฌํํ๋ค.
package egovframework.system.user.service;
import java.io.Serializable;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.DynamicUpdate;
import egovframework.system.manage.service.ComtnemplyrscrtyestbsT;
import lombok.Data;
@Entity
@Table(name = "comtngnrlmber")
@DynamicUpdate
@Data
public class SystemAdminUserVO implements Serializable {
@Id
@Column(name = "mber_id", updatable=false)
private String mberId;
@Column(name = "password")
private String password;
@Column(name = "password_hint")
private String passwordHint;
@Column(name = "password_cnsr")
private String passwordCnsr;
@Column(name = "ihidnum")
private String ihidnum;
@Column(name = "mber_nm")
private String mberNm;
@Column(name = "zip")
private String zip;
@Column(name = "adres")
private String adres;
@Column(name = "area_no")
private String areaNo;
@Column(name = "mber_sttus")
private String mberSttus;
@Column(name = "detail_adres")
private String detailAdres;
@Column(name = "end_telno")
private String endTelno;
@Column(name = "mbtlnum")
private String mbtlnum;
@Column(name = "group_id")
private String groupId;
@Column(name = "mber_fxnum")
private String mberFxnum;
@Column(name = "mber_email_adres")
private String mberEmailAdres;
@Column(name = "middle_telno")
private String middleTelno;
@Column(name = "sbscrb_de", updatable=false)
private String sbscrbDe;
@Column(name = "sexdstn_code")
private String sexdstnCode;
@Column(name = "esntl_id")
private String esntlId;
@Column(name = "lock_at")
private String lockAt;
@Column(name = "lock_cnt")
private String lockCnt;
@Column(name = "lock_last_pnttm")
private String lockLastPnttm;
@Column(name = "chg_pwd_last_pnttm")
private String chgPwdLastPnttm;
@Column(name = "usergrade")
private String usergrade;
@Column(name = "del_yn")
private String delYn;
@Transient
private String passwordComfirm;
@OneToMany
@JoinColumn(name = "scrty_dtrmn_trget_id", referencedColumnName="esntl_id",insertable = false, updatable = false)
private Set<ComtnemplyrscrtyestbsT> comtnemplyrscrtyestbsT;
}
๊ฐํน left join on ์ and ๋ฅผ ์ถ๊ฐํ๋ ์ฟผ๋ฆฌ๊ฐ์๋ค ์๋ฅผ๋ค์ด
select
comtnrolei0_.role_code as role_cod1_6_0_,
comtauthor1_.role_code as role_cod1_1_1_,
comtnrolei0_.role_creat_de as role_cre2_6_0_,
comtnrolei0_.role_dc as role_dc3_6_0_,
comtnrolei0_.role_nm as role_nm4_6_0_,
comtnrolei0_.role_pttrn as role_ptt5_6_0_,
comtnrolei0_.role_sort as role_sor6_6_0_,
comtnrolei0_.role_ty as role_ty7_6_0_,
comtauthor1_.author_code as author_c2_1_1_,
comtauthor1_.creat_dt as creat_dt3_1_1_
from
comtnroleInfo comtnrolei0_
left outer join
comtnauthorrolerelate comtauthor1_
on comtnrolei0_.role_code=comtauthor1_.role_code
and (
comtauthor1_.author_code=?
)
where
1=1
order by
comtnrolei0_.role_creat_de desc limit ?
์ด๋ฐ์์ผ๋ก... ์ด๋ด๋ oneToMany ๋ก ์กฐ์ธ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ค (Set ์ด๋ ๊ฒํ๊ณ )
// join
Root<ComtnroleInfoVO> comtnroleInfo = criteria.from(ComtnroleInfoVO.class);
Join<ComtnroleInfoVO, ComtnauthorrolerelateVO> comtauthorroleate = comtnroleInfo.join("comtauthorroleateVO", JoinType.LEFT);
comtauthorroleate.on(
criteriaBuilder.and(
criteriaBuilder.equal(comtauthorroleate.get("authorCode"), authorCode)
)
);
์ด๋ ๊ฒ ํ๋ค.
@DynamicUpdate ๋ ์์ ํ๋ ค๋ ์ปฌ๋ผ๋ง ์์ ํ๋๋ก entity ์ ์ค์ ํด๋๋ฉด ๋๋ค. ์ด๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ช ์ํด์ฃผ๊ฒ๋๋ฉด ์์ ํ๋ ค๋ ์ปฌ๋ผ๋ง ์์ ํ์ฌ persist ํ ์์๋ค.
@DynamicUpdate ๋ฅผ ๋ช ์ํ์ง์์๊ฒฝ์ฐ ์๋ฅผ๋ค์ด userId ๋ฅผ ์์ ํ๋ฉด ์ ์ฒด ์ปฌ๋ผ์ด ์์ ๋๋ ์ํฉ์ด ๋ฐ์ํ๋ , @DynamicUpdate ๋ฅผ ๋ช ์ํ๊ฒ๋๋ค๋ฉด userId ๋ง ์์ ํ๊ฒ ํ ์์๋ค.
updatable=false ์ค์ ์ ํตํด ์ ๋ฐ์ดํธ ๋ฅผ ํ์ง๋ชปํ๊ฒ ํด๋น ์ํฐํฐ์ ์ปฌ๋ผ์ ์ค์ ์ ํ ์์๋ค.
๋ฉ์ด๋ธ ์ปดํ์ผ์ด ์๋ ๋
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
์ด๋ฐ ์ค๋ฅ ๋์
<!-- JAXB API only -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- JAXB RI, Jakarta XML Binding -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.0</version>
<scope>runtime</scope>
</dependency>
ํด์ฃผ๋ ๋
์คํ๋ง ๋ ๊ฑฐ์๋ ์ ์์ ๋ถ์์ ํ์ด๋ฒ๋ค์ดํธ์ ๋ง์ด๋ฐํฐ์ค๋ฅผ ๊ฐ์ด ์ธ๊ฒฝ์ฐ์ด๋ค.. ๋ฌผ๋ก ์ ์์ ๋ถ์์ ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ด๋ค๋ฉด..(๊ทธ๋ด์ผ์ ์ ๊ฒ ์ง๋ง..) ํ์๊ฐ ์ ์์ ๋ถ์๋ค ์ฝ์ง์ ํ๋ฉฐ ๊ณ ์ํ๋์ ๋๊ฐ๋ค ์ค์ ํ๋ค. ์ด๊ฒ ๊ทธ๋ ๊ฒ ์ด๋ ค์ด๊ฒ์ ์๋๋ฐ ์ด์ํ๊ฒ ์ค์ ์ด ๊ผฌ์ฌ์ ๋๋ฌด ํ๋ค์๋ค.
ํ๋ก์ ํธ ์ฐํด๋ฆญ โ configure โ Convert to JPA Project' ์ ํตํด JPA ํ๋ก์ ํธ๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ฐ๋ค์ ์๋ฅผ ๋ณด๋ฉด persistence.xml ํ์ผ์ด ์์ฑ๋ ํ ๋ฐ. ๊ฑฐ๊ธฐ์ hibernate db connection ์ ๋ณด ๋ฑ์ ์์ฑํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="EMS">
<class>egovframework.com.bo.cmm.entity.BoMenuManageEntity</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.CUBRIDDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.url" value=""/>
<property name="hibernate.connection.driver_class" value="cubrid.jdbc.driver.CUBRIDDriver"/>
<property name="hibernate.connection.username" value=""/>
<property name="hibernate.connection.password" value=""/>
</properties>
</persistence-unit>
</persistence>
๊ทธ๋ฐ๋ค์ jpa configํ์ผ์ ์์ฑํ๋ค .
๊ทธ๋ฐ๋ค์ ์์๊ฐ์ด ์์ฑํด์ค๋ค.
package egovframework.com.bo.cmm.repository;
import javax.persistence.EntityManagerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
@Configuration
@EnableJpaRepositories(basePackages = {"egovframework.com.bo.cmm.repository"})
public class JpaConfig {
@Bean
public LocalEntityManagerFactoryBean entityManagerFactory() {
LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
factoryBean.setPersistenceUnitName("EMS"); // ์์์ persistence.xml ํ์ผ์์ ์ ํ persistence-unit name = "EMS" ๊ทธ๋๋ก ์ ์ด์ค๋ค.
return factoryBean;
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
}
์ด๊ธฐ sql script
CREATE TABLE sys.board_comment (
comment_no int (11) auto_increment primary key ,
board_no int (11),
name varchar(200),
comment varchar(600),
created_time dateTime,
delete_time dateTime,
updated_time dateTime
)
CREATE TABLE sys.board (
board_no int (11) auto_increment primary key ,
name varchar(200),
title varchar(200),
content varchar(600),
created_time dateTime,
delete_time dateTime,
updated_time dateTime
)
- dependency
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
์ํฐํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๊ณผ ๋งคํ์์ผ์ค๋ค. ์ผ๋จ mysql ์ ๊ธฐ์ค์ผ๋ก ์์ฑํ๋ค.
@Entity(name = "boardComment") //ํ
์ด๋ธ ์ด๋ฆ
public class BoardCommentEntity {
// ์ปฌ๋ผ
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // mysql ์์ autoincrement ํ pk ๊ณ ์ id๋ฅผ ๊ฐ๋ id ์ปฌ๋ผ์์ ๋ช
์ํด์ค๋ค. db๋ฐฉ์ธ์๋ฐ๋ผ์ ์ค์ ๋ฐฉ๋ฒ๋ ๋ค๋ฅด๋ค.
private int commentNo;
private int boardNo;
private String name;
private String comment;
private String createdTime;
private String deleteTime;
private String updatedTime;
public int getCommentNo() {
return commentNo;
}
public void setCommentNo(int commentNo) {
this.commentNo = commentNo;
}
public int getBoardNo() {
return boardNo;
}
public void setBoardNo(int boardNo) {
this.boardNo = boardNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getCreatedTime() {
return createdTime;
}
public void setCreatedTime(String createdTime) {
this.createdTime = createdTime;
}
public String getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(String deleteTime) {
this.deleteTime = deleteTime;
}
public String getUpdatedTime() {
return updatedTime;
}
public void setUpdatedTime(String updatedTime) {
this.updatedTime = updatedTime;
}
๋ ํ์งํ ๋ฆฌ์์๋ ๋ ํ์งํ ๋ฆฌ interface ๋ฅผ ์์ฑํ๊ณ jparepository์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋๋ค.์ด๋ ์์๋ฐ๊ฒ๋๋ฉด crud api๋ฅผ ์ฌ์ฉํ ์์๊ฒ๋๋ค.
@Repository
public interface BoardCommentRepository extends JpaRepository<BoardCommentEntity, Integer> {
}
๋ ํ์งํ ๋ฆฌ์์ ์์ฑํ ๋ฉ์๋๋ ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ถ๋ก ํ์ฌ jpa์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ฃผ๊ธฐ๋ํ๋ค. ์์๋ ๋ค์๊ณผ๊ฐ๋ค.
@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Integer> {
List<?> findBydeleteTimeNull(Pageable result);
}
์ด๋ ๊ฒ ํ๋ฉด. deleteTime ์ด null ์ธ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ์จ๋ค.
ํ์ด์ง ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
/**
* ๊ฒ์๋ฌผ list ๋ฅผ ์กฐํํ๋ api
*
* @param req
* @return
*/
@GetMapping("/select")
public ResponseEntity<?> selectBoardList(HttpServletRequest req) {
String pageNum = req.getParameter("pageNum");
if (pageNum == "" || pageNum == null) {
pageNum = "0";
}
Pageable result = PageRequest.of(Integer.parseInt(pageNum), 10, Sort.by("createdTime").descending());
return new ResponseEntity<>(board.findBydeleteTimeNull(result), HttpStatus.OK);
}
๋ค์์ ๋ณด๋ฉด Pageable ์ด๋ผ๋ class ๋ฅผ ์ฌ์ฉํ์ฌ PageNum ์ ๋ฐ์์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ค. Sort.by๋ฅผ ํตํด ์ ๋ ฌ์ ํ ์์๋ค.
jpa ์์ ์กฐ์ธํ๋๋ฐฉ๋ฒ์ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ entity ์ ์กฐ์ธ ํ๋ ค๋ ํ ์ด๋ธ entity ๋ฅผ ๋ช ์ํด์ฃผ๋ฉด๋๋ค. ์๋ฅผ๋ค์๋ฉด ๋ค์๊ณผ๊ฐ๋ค.
/**
* board = ๊ฒ์๋ฌผ ํ
์ด๋ธ
*/
@Entity(name = "board") // table name
public class BoardEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int boardNo;
private String name;
private String title;
private String content;
private String createdTime;
private String deleteTime;
private String updatedTime;
@OneToOne
@JoinColumn(name = "boardNo", insertable = false, updatable = false)
private BoardCommentEntity boardComment;
public int getBoardNo() {
return boardNo;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public BoardCommentEntity getBoardComment() {
return boardComment;
}
public void setBoardComment(BoardCommentEntity boardComment) {
this.boardComment = boardComment;
}
public void setBoardNo(int boardNo) {
this.boardNo = boardNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCreatedTime() {
return createdTime;
}
public void setCreatedTime(String createdTime) {
this.createdTime = createdTime;
}
public String getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(String deleteTime) {
this.deleteTime = deleteTime;
}
public String getUpdatedTime() {
return updatedTime;
}
public void setUpdatedTime(String updatedTime) {
this.updatedTime = updatedTime;
}
}
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ง์์ด ๊ฐ๊ฒ ์ง๋ง
@OneToOne @JoinColumn(name = "boardNo", insertable = false, updatable = false) private BoardCommentEntity boardComment; ์ด ๋ถ๋ถ์์ oneToOne ์ 1:1 ๊ด๊ณ ๋ผ๋ ์๋ฏธ์ด๋ค. ์ฆ entity ๊ด๊ณ๋ฅผ 1๋1 ๊ด๊ณ๋ก ์ค์ ํ๊ณ joinColumn ์ boardNo ๋ก ๋ช ์ํ๊ฒ ๋๋ฉด ๋๋ค.
์ํฐํฐ ๊ฐ์ ๊ด๊ณ ์ค์ ์ 1๋1 1๋ ๋ค ๋ค๋๋ค ๋ก ๋ค์ํ๋ค . ํ ์ด๋ธ ๊ด๊ณ์ ๊ฐ๋ค.
์ด๋ฅผ sql ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
select * from board b1 left join boardComment b2 on b1.boardNo = b2.boardNo;
criteria ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ๋น๋ ๋ก์จ ์ง์๋ฌธ์ java method ๋ก ์์ฑํจ์ผ๋ก์จ sql ์ ๋์ ์ผ๋ก ์์ฑํ ์์๋ค. ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ์์ข๋ค.. ํ๋ฃจ๋นจ๋ฆฌ querydsl ๋ก ๋ฐ๊ฟ์ ์ด๋ฅผ ๋ณด์ํ๋๋กํ์..
- ์ฌ์ฉ๋ฒ
@PersistenceContext
EntityManager entityManager;
๋ฅผ ์ถ๊ฐํด์ค๋ค.
public List<Board> testGetList(final int startRow, final int pageSize)
{
// CriteriaBuilder ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
// CriteriaQuery ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
CriteriaQuery<Board> criteriaQuery = criteriaBuilder.createQuery(Board.class);
// Root๋ ์์์ ์ํฐํฐ๋ฅผ ํ์ํ๋ ์ฟผ๋ฆฌ ํํ์์ด๋ค. SQL์ FROM ๊ณผ ์ ์ฌํจ
Root<Board> root = criteriaQuery.from(Board.class);
// SQL์ WHERE์ ์ด๋ค. ์กฐ๊ฑด๋ถ๋ CriteriaBuilder์ ์ํด ์์ฑ
Predicate restrictions = criteriaBuilder.equal(root.get("boardTitle"), "jpa");
criteriaQuery.where(restrictions);
// ORDER BY์ . CriteriaQuery๋ก ์์ฑ
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("boardIdx")));
// TypedQuery๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ ํ์
์ด๋ค.
TypedQuery<Board> boardListQuery = entityManager.createQuery(criteriaQuery).setFirstResult(startRow).setMaxResults(pageSize);
List<Board> boardList = boardListQuery.getResultList();
return boardList;
}
ํด๋น ์ฝ๋๋ ๋์ ์ผ๋ก parameter ๊ฐ ๋์ด์ฌ ๊ฒฝ์ฐ and ์กฐ๊ฑด์ ์ถ๊ฐํด์ฃผ๋ ์ฝ๋์ด๋ค. and ์กฐ๊ฑด์ ์ถ๊ฐํ ๋๋ criteriaBuilder.and() ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ or ์กฐ๊ฑด์ criteriaBuilder.or() ๋ฅผ ์ฌ์ฉํ๋ค.
Predicate condition1 = null ;
Predicate condition2 = null ;
Predicate defaultCondition = criteriaBuilder.equal(root.get("delYn"), 'N');
Predicate orderByCondition = criteriaBuilder.eq
Predicate goodsConditions = null;
if(searchCondition.get("gds_nm") != null) {
condition1 = criteriaBuilder.equal(root.get("gds_nm"), searchCondition.get("gds_nm").toString());
}
if(searchCondition.get("reg_ymd")!= null) {
condition2 = criteriaBuilder.equal(root.get("reg_ymd"), searchCondition.get("reg_ymd").toString());
}
if(condition1 != null && condition2 != null ) {
goodsConditions = criteriaBuilder.and(condition1, condition2,defaultCondition);
criteriaQuery.where(goodsConditions);
}else if(condition1 != null) {
goodsConditions = criteriaBuilder.and(condition1, defaultCondition);
} else if (condition2 != null) {
goodsConditions = criteriaBuilder.and(condition2, defaultCondition);
}
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("reg_ymd")));
result = entityManager.createQuery(criteriaQuery).getResultList();
TypedQuery<AdminUserVO> boardListQuery = entityManager.createQuery(criteriaQuery).setFirstResult(Integer.parseInt(pageNum)).setMaxResults(fetchSize);
๋
List<Tuple> tuples = new ArrayList<Tuple>();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
List<HashMap<String, Object>> resultArr = new ArrayList<HashMap<String, Object>>();
HashMap<String , Object> tupleResultMap = null;
CriteriaQuery<Tuple> criteria = criteriaBuilder.createTupleQuery();
Root<ComtnroleInfoVO> comtnroleInfo = criteria.from(ComtnroleInfoVO.class);
//Root<ComtauthorroleateVO> comtauthorroleate = criteria.from(ComtauthorroleateVO.class);
try {
// join
Join<ComtnroleInfoVO, ComtauthorroleateVO> comtauthorroleate = comtnroleInfo.join("comtauthorroleateVO", JoinType.LEFT);
Predicate conditions = criteriaBuilder.equal(comtauthorroleate.get("authorCode"), Auth);
criteria.multiselect(comtnroleInfo, comtauthorroleate)
.where(conditions);
tuples = entityManager.createQuery(criteria).getResultList();
for (Tuple tuple : tuples) {
tupleResultMap = new HashMap<String , Object>();
tupleResultMap.put("roleCode", tuple.get(comtnroleInfo).getRoleCode());
tupleResultMap.put("roleCreateDe", tuple.get(comtnroleInfo).getRoleCreatDe());
tupleResultMap.put("roleDc", tuple.get(comtnroleInfo).getRoleDc());
tupleResultMap.put("roleNm", tuple.get(comtnroleInfo).getRoleNm());
tupleResultMap.put("rolePttrn", tuple.get(comtnroleInfo).getRolePttrn());
tupleResultMap.put("roleSort", tuple.get(comtnroleInfo).getRoleSort());
tupleResultMap.put("authorCode", tuple.get(comtauthorroleate).getAuthorCode());
resultArr.add(tupleResultMap);
}
}catch(Exception e) {
e.printStackTrace();
}
return resultArr ;
}
@Service("loginService")
public class LoginService {
@PersistenceContext
EntityManager entityManager;
@Autowired
private PasswordEncoder passwordEncoder;
AdminUserVO userEntity;
public AdminUserVO doLogin(String mberId , String password) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<AdminUserVO> criteriaQuery = criteriaBuilder.createQuery(AdminUserVO.class);
Root<AdminUserVO> root = criteriaQuery.from(AdminUserVO.class);
TypedQuery<AdminUserVO> user = null;
Predicate passwordCondition = null ;
passwordCondition = criteriaBuilder.equal(root.get("mberId"),mberId);
String encodingPassword = passwordEncoder.encode(password);
criteriaQuery.where(passwordCondition);
try {
userEntity = entityManager.createQuery(criteriaQuery).getSingleResult();
boolean isMatchedPassword = passwordEncoder.matches(password, userEntity.getPassword());
System.out.println("is matched password ? " + isMatchedPassword);
}catch(Exception e) {
return null;
}
return userEntity;
}
}
์ด๊ฑฐ ํน์ดํ๊ฒ๋ passwordEncoder ๋ฅผ ์ฐ๋ฉด password ๊ฐ ํญ์ ๋ค๋ฅธ ๊ฐ์ ์ํธํํ๊ฒ๋๋๋ฐ
๊ทธ๋ฅ ๋๋น์์ userId ๋ก ์กฐํํํ , ํ๋ฌธ๋น๋ฐ๋ฒํธ์ ์กฐํํ์ฌ ๊ฐ์ ธ์จ ์ํธํ๋ password ๋ฅผ
passwordEncoder.matches(password, userEntity.getPassword()
์ด api ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์นํ๋์ง ์ฌ๋ถ๋ฅผ ํ๋ณํด์ฃผ๋ฉด๋๋ค.
์ฐธ๊ณ : https://groups.google.com/g/ksug/c/1W11JJ6AZxc
criteria ์ ๋นํด ๊ฐ๋ ์ฑ๋ ์ข๊ณ , ๊น๋ํ๊ฒ ์์ฑํ ์์์ด์ ์ข๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค ๊ธ์ ๋ณด๋ฉด jpa ์ querydsl ์กฐํฉ์ผ๋ก ๊ฐ๋๋ฏํ๋ค. ์ฟผ๋ฆฌ dsl ์ ์ฐ๋ ค๋ฉด Q class ๋ฅผ ์์ฑํด์ผํ๋๋ฐ , ํ๋ฌ๊ทธ์ธ์ผ๋ก ์๋์์ฑํ๋ค Q class๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ ์์๋ค. querydsl ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ๊ฐ๋ค.
์ฐ์ querydsl dependency ๋ฅผ ๋ฐ๊ณ , ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋๋ค ํ๋ฌ๊ทธ์ธ์ Q ํด๋์ค๋ฅผ ์๋์ผ๋ก ์์ฑํ๋๋ก ๋์์ฃผ๋ ํ๋ฌ๊ทธ์ธ์ด๋ค.
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
์ฒซ๋ฒ์งธ querydsl-apt ๋ q class ์๋์์ฑ์ ์ํ ์์กด์ฑ์ด๋ฉฐ
๋๋ฒ์งธ querydsl-jpa ๋ querydsl ์ jpa ์์ ์ฌ์ฉํ ์์๋๋ก ํด์ฃผ๋ ์์กด์ฑ์ด๋ค.
์ด๊ฑฐ ์์กด์ฑ๋ ์์ฐพ์์ ํด์ผํ๋ค ํ์๋ ๋ธ๋ก๊ทธ ์์ ๋ณต๋ถํด์ ์๋์๋์ ๋ฉํ์ด ์์คํํธ์ ๊ฐ๋ ธ๋๋ฐ ๊ณต์๋ฌธ์์์๋ ์์กด์ฑ์๋ฃ์ด์ฃผ๋ ํด๊ฒฐ๋์๋ค. ์ด๋ด๋ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํ์
<!-- querydsl plugin -->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
</plugin>
๊ทธ๋ฐ๋ค์ mvn compile ์ ํ๋ฉด target ๋ฐ์ generated-source ์ q class ๊ฐ ์์ฑ๋๋ค. q class ๋ ์ํฐํฐ๋ฅผ ๋ณต์ ํ์ฌ querydsl ์์ q class ๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋๋กํ๋ค.
ํ์ฅํ๋ก๊ทธ๋จ์์ test runner for java , debug for java ๋ฒ์ ์ ๋ฎ์ถ๊ฑฐ๋ , ์ฌ์ฉ์ํจ์ผ๋ก ํ์ ์ด๊ฑฐ๋๋งค ๋ฉํ ๊ฐ๋ ธ๋ค
๊ฐํน vscode ์์
.vscode folder in .java is not on the classpath of project
์ด๋ฐ ์ค๋ฅ๊ฐ ๋จ๋๊ฒฝ์ฐ pom.xml ์ฐํด๋ฆญํ๊ณ , maven ์ ๋ฐ์ดํธ ํด์ค๋ค.
๊ทธ๋ฌ๋ฉด ์ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๊ณ Qclass ๋ฅผ ์ํฌํธ ํด์ค์์๋ค.
์์๊ฐ์ด q class ๋ค์ ์ฐธ์กฐํ ์์๋ค.
๊ทธ๋๋ ์๋๋ฉด , pom์ ๋ช ์๋์ด์๋ java version ๊ณผ , ํ์ฌ ํ๋ก์ ํธ ๋ฒ์ ผ์ ํ์ธํด๋ณธ๋ค.
์ฐธ๊ณ ๋ฌธํ:https://www.inflearn.com/questions/35226
ํ์๋ criteria query , jpaquery, jpaqueryFactory 3๊ฐ ๊ฐ๋จํ๊ฒ ์จ๋ดค์ง๋ง jpaqueryFactory ๋ฅผ ์ฐ๋ ์ ๋ค๋ ๋ง์๊ฑฐ๊ฐ๊ณ ๋๋ถ๋ถ ์ฟผ๋ฆฌํฉํ ๋ฆฌ๋ก ํ๋๊ฑฐ๊ฐ๋ค ๊ฑ ์ด๊ฑฐ์จ๋ผ
์ฌ์ค jpa ์์ ์ ๊ณตํด์ฃผ๋ jparepository๋ง ์ฐ๋ค๊ฐ where ์กฐ๊ฑด์ ์ถ๊ฐํด์ค์ผ๊ฒ ๋คํด์ ํด์ฃผ๋๊น ๋ญ ๋ถ๊ธฐ๋ณ๋ก ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ๋์ ์ด๊ฑด์ข...
ํ๋ค๊ฐ criteria ๋ฅผ ์ฐพ๊ฒ๋์๊ณ ๋ง์นจ 1๋ ์ ์ ์ฉ์ ์ ๋ ํ์ด๋ฒ๋ค์ดํธ criteria ๋ฅผ ์ ๊น ์ ์ง๋ณด์ํ์ ์ด ์์ด์ ํด๋ดค๋ค๊ฐ ์ ์ด๊ฑด ... ๊ฐ๋ ์ฑ์ด ์ฐ๋ ๊ธฐ๋ค.. ์ถ์ด์ ์ฐพ์๋ณด๋ค๊ฐ queryDsl ๋ณด๊ณ .. querydsl ์์ jpaquery ์ฐ๋ค๊ฐ ๋ค๋ค jpaqueryfactory ์ฐ๊ณ ์์๊ณ .. ์์.. ๋๋ง ์ง์ฌ์ด์์ง..
์๋ queryDsl ์์ ๋ฒ์ ์์๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํด์ค์ผ join ์ด ๋์๋ค. ํ์ง๋ง ๋ฒ์ ์ ๋๋ฉด์ ์ฐ๊ด๊ด๊ณ ๋งคํ ์์ด ํฌ๋ฆฐํค๋ก (์ปฌ๋ผ) ์ผ๋ก ์กฐ์ธํ๋๊ฒ ๊ฐ๋ฅํด์ก๋ค. ์ฌ์ค ์ด๋ ๊ฒ ํ๊ธฐ๊น์ง ๋ง์ ์ํ์ฐฉ์ค๊ฐ ์์๋ค. ์ ์ด์ ์์กด์ฑ๋ง ์๋ฐ์์ผ๋ฉด ์ด๋ฌ์ง๋ ์์๋ค.
์กฐ์ธํ ๋ ์ปฌ๋ผ 2๊ฐ์ด์ ์ ๋ ํธํ๊ฒ ๋ ํ ๋ฐ
์ด๋ tuple ๋ก ๋ฐ์์ผํ๋ค. ์๋ฐ์ผ๋ฉด ์ค๋ฅ๋จ ๊ทผ๋ฐ ๋ค๋ฅธ์ฌ๋์ ์๋๋๊ฑฐ ๊ฐ๋๋ฐ ๋ ๋๋ง์ด๋ฌ์ง.. ๋๋ง์ง์ฌ์ด์ง ์ง์ง ๊ฐ์ ์ฐ๋ ๊ธฐํต์ด๋ค ๋๋ง ๋นํด๋ฒ๋ ธ๋ค ๋๋ผ์ ๋นํ๋ค..
QTestBoardEntity board = new QTestBoardEntity("q1");
QTestBoardFileEntity file = new QTestBoardFileEntity("q2");
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
List<Tuple> result = queryFactory
.select(board, file)
.from(board)
.join(file)
.on(board.fileNo.eq(file.fileNo))
.fetch();
for (Tuple tuple : result) {
System.out.println("test!!!====>" + tuple.get(board).getBoardNo());
System.out.println("test =====>" + tuple.get(file).getFileName());
}
return new ResponseEntity<>(
"",
HttpStatus.OK);
}
@GetMapping("/test2")
public ResponseEntity<?> test2() {
QTestBoardEntity board = new QTestBoardEntity("q1");
QTestBoardFileEntity file = new QTestBoardFileEntity("q2");
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
return new ResponseEntity<>(
queryFactory
.select(board)
.from(board)
.where(board.userName.eq("์ฃผํ"))
.orderBy(board.createdTime.asc())
.offset(0)
.limit(10)
.fetch(),
HttpStatus.OK);
}
queryDsl ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ ๋ JPAExpressions ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์์๋ฐ.
@GetMapping("/test3")
public ResponseEntity<?> test3() {
/**
* select *
* from sys.taiko_board t1
* left join sys.taiko_board_file t2
* on t1.file_no = t2.file_no
*
* where t1.board_no = (select board_no from sys.taiko_board where board_no =
* '290')
*
*/
QTestBoardEntity board = new QTestBoardEntity("q1");
QTestBoardFileEntity file = new QTestBoardFileEntity("q2");
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
JSONObject obj = new JSONObject();
List<Tuple> result = queryFactory
.select(board.contents, board.userName, file.fileName, file.filePath)
.from(board)
.leftJoin(file)
.on(board.fileNo.eq(file.fileNo))
.where(board.boardNo
.in(JPAExpressions
.select(board.boardNo)
.from(board)
.where(board.boardNo.eq(290))))
.fetch();
result.forEach(item -> obj.put("data", item.toArray()));
return new ResponseEntity<>(obj, HttpStatus.OK);
}
}
์์งํ ๋๋ฌดํ๋ค์์ต๋๋ค. ์๋ฒฝ 4์๊น์ง ์ฝ์งํ๊ณ ์ฝ์งํ๊ณ .. ๊ฒ์๋ ํด๋ณด๊ณ .. ๋ญ ์ธ๋์ธ์ด ํ์ด๋ฒ๋ค์ดํธ ์ค๋ช ํ๋ ์ ํ๋ธ ์์๋ ๋ณด๊ณ .. ํ๋๋ ์๋ค๋ฆฌ๋ ์ฝฉ๊ธ๋ฆฌ์ ์ธ๋์ธ ์์ด ์ฃผ๋จน๋ฌผ๊ณ ์ค์ดํ๋ฉด์ ๋ณด๋ฉด์.. ๋ฐ๋ผํด๋ณด๊ณ ๊ทธ๋ฌ์ง๋ง ๊ฒฐ๊ตญ์ ์์กด์ฑ์ฃผ์ ์ ์๋ชปํด์คฌ๊ธฐ๋๋ฌธ์ ์ผ์ด๋ ๋์ฐธ์ฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฑธ ํ์ ์์ ์ธ์๊ฐ์ ๋ท๋ชฉ์ก๊ณ ์ฐ๋ฌ์ง๊ฒ๊ฐ์ต๋๋ค. ๊ณต๋ถ๋์ ๋๋ ค์๋ผ๋ ํ์ด๋ฒ๋ค์ดํธ ์ฐ๋๋กํด์ผ๊ฒ ์ต๋๋ค.
https://ultrakain.gitbooks.io/jpa/content/chapter10/chapter10.4.html : queryDsl ์ฌ์ฉ๋ฒ ํธ๋๋ถ์ธ๋ฏํ๋ค
https://www.youtube.com/watch?v=3HzIvCF7miQ : youtube ์์ querydsl ์๋ํ ์ฌ์ฉ๋ฒ์ ์์์ผ๋ก ์ฐ์๊ฒ์ธ๋ฏํ๋ค.
http://querydsl.com/index.html : queryDsl ๊ณต์์ฌ์ดํธ๋ค ์ ๋ขฐ๋๊ฐ ์ ์ผ๋๋ค