Skip to content

zuzu578/JPA-boilerPlate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

75 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Integer property ๋ฅผ like ๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ

๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•œ๋‹ค.

์ฐธ์กฐ : https://stackoverflow.com/questions/10230680/criteria-query-search-for-integer-using-like

predicates.add(criteriaBuilder.like(orderRoot.get(sKey).as(String.class), "%"+""+sWords+""+"%"));		

id column ๋ผ๋ฆฌ join ํ•˜์ง€ ์•Š๊ณ  , fk ๋ผ๋ฆฌ ์กฐ์ธํ• ๊ฒฝ์šฐ

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 ์ถ”๊ฐ€ํ•˜๊ธฐ

๊ฐ„ํ˜น 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

@DynamicUpdate ๋Š” ์ˆ˜์ •ํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ๋งŒ ์ˆ˜์ •ํ•˜๋„๋ก entity ์— ์„ค์ •ํ•ด๋‘๋ฉด ๋œ๋‹ค. ์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ช…์‹œํ•ด์ฃผ๊ฒŒ๋˜๋ฉด ์ˆ˜์ •ํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ๋งŒ ์ˆ˜์ •ํ•˜์—ฌ persist ํ• ์ˆ˜์žˆ๋‹ค.

@DynamicUpdate ๋ฅผ ๋ช…์‹œํ•˜์ง€์•Š์„๊ฒฝ์šฐ ์˜ˆ๋ฅผ๋“ค์–ด userId ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ „์ฒด ์ปฌ๋Ÿผ์ด ์ˆ˜์ •๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋‚˜ , @DynamicUpdate ๋ฅผ ๋ช…์‹œํ•˜๊ฒŒ๋œ๋‹ค๋ฉด userId ๋งŒ ์ˆ˜์ •ํ•˜๊ฒŒ ํ• ์ˆ˜์žˆ๋‹ค.

** updatable=false

updatable=false ์„ค์ •์„ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ๋ฅผ ํ•˜์ง€๋ชปํ•˜๊ฒŒ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ์ปฌ๋Ÿผ์— ์„ค์ •์„ ํ• ์ˆ˜์žˆ๋‹ค.

JPA-boilerPlate

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 53 48

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 04 18

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 55 06

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 57 29

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 58 44

ํ•„์ž๋Š” ํ•˜์ด๋ฒ„๋„ค์ดํŠธ , jpa ์„ธํŒ…ํ•˜๋‹ค๊ฐ€ ๋จธ๋ฆฌํ„ธ์ด ๋ช‡๊ฐœ ๋น ์ง„๊ฒƒ๊ฐ™์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 59 20

์†๋ณด ์†๋ณด ์†๋ณด

๋ฉ”์ด๋ธ ์ปดํŒŒ์ผ์ด ์•ˆ๋ ๋•Œ

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>

ํ•ด์ฃผ๋‹ˆ ๋Œ

spring legacy ์—์„œ hibernate , jpa ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ™˜๊ฒฝ์„ค์ •

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 00 29

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 02 36

์Šคํ”„๋ง ๋ ˆ๊ฑฐ์‹œ๋‚˜ ์ „์ž์ •๋ถ€์—์„œ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์™€ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋ฅผ ๊ฐ™์ด ์“ธ๊ฒฝ์šฐ์ด๋‹ค.. ๋ฌผ๋ก  ์ „์ž์ •๋ถ€์—์„œ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ์“ด๋‹ค๋ฉด..(๊ทธ๋Ÿด์ผ์€ ์ ๊ฒ ์ง€๋งŒ..) ํ•„์ž๊ฐ€ ์ „์ž์ •๋ถ€์—๋‹ค ์‚ฝ์งˆ์„ ํ•˜๋ฉฐ ๊ณ ์ƒํ•œ๋์— ๋‘๊ฐœ๋‹ค ์„ค์ •ํ–ˆ๋‹ค. ์ด๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด๊ฒƒ์€ ์•„๋‹Œ๋ฐ ์ด์ƒํ•˜๊ฒŒ ์„ค์ •์ด ๊ผฌ์—ฌ์„œ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 55 38

ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ โ†’ configure โ†’ Convert to JPA Project' ์„ ํ†ตํ•ด JPA ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. test111

๊ทธ๋Ÿฐ๋‹ค์Œ ์œ„๋ฅผ ๋ณด๋ฉด persistence.xml ํŒŒ์ผ์ด ์ƒ์„ฑ๋ ํ…๋ฐ. ๊ฑฐ๊ธฐ์— hibernate db connection ์ •๋ณด ๋“ฑ์„ ์ž‘์„ฑํ•œ๋‹ค.

persistence.xml

<?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ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค . ์Šคํฌ๋ฆฐ์ƒทtetestsetests-11

๊ทธ๋Ÿฐ๋‹ค์Œ ์œ„์™€๊ฐ™์ด ์ž‘์„ฑํ•ด์ค€๋‹ค.

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;
	  } 
	

}

spring boot ์™€ JPA ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ.

configuration

์ดˆ๊ธฐ 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
 
) 

  1. dependency
<dependencies>
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

์ƒ์„ฑํŒŒ์ผ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-05-22 แ„‹แ…ฉแ„’แ…ฎ 5 02 31

entity

์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘์‹œ์ผœ์ค€๋‹ค. ์ผ๋‹จ 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;
    }

repository

๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์„œ๋Š” ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ 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 ์ธ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.

jpa ์—์„œ ํŽ˜์ด์ง•์€ ์–ด๋–ป๊ฒŒํ•˜๋‚˜์š”?

ํŽ˜์ด์ง• ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

/**
     * ๊ฒŒ์‹œ๋ฌผ 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 ์—์„œ join์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

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 ์งˆ์˜๋ฌธ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„’แ…ฎ 11 55 06

criteria ๋ž€ ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ๋นŒ๋” ๋กœ์จ ์งˆ์˜๋ฌธ์„ java method ๋กœ ์ž‘์„ฑํ•จ์œผ๋กœ์จ sql ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ• ์ˆ˜์žˆ๋‹ค. ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ์•ˆ์ข‹๋‹ค.. ํ•˜๋ฃจ๋นจ๋ฆฌ querydsl ๋กœ ๋ฐ”๊ฟ”์„œ ์ด๋ฅผ ๋ณด์™„ํ•˜๋„๋กํ•˜์ž..

  1. ์‚ฌ์šฉ๋ฒ•
@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;

}

criteria ์งˆ์˜๋ฌธ์—์„œ where ์กฐ๊ฑด and ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ํ•˜๊ธฐ.

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋™์ ์œผ๋กœ 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();
		    	 

criteria ์—์„œ paging ํ•˜๋Š”๋ฒ•

TypedQuery<AdminUserVO> boardListQuery = entityManager.createQuery(criteriaQuery).setFirstResult(Integer.parseInt(pageNum)).setMaxResults(fetchSize);

๋

criteria ์—์„œ entity ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์กฐ์ธํ•˜๋Š”๋ฒ• ( metamodel ์ƒ์„ฑ์•ˆํ•˜๊ณ  ์กฐ์ธ )

		
		  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 ; 
	}

criteria ์—์„œ ๋กœ๊ทธ์ธ ๋กœ์ง

@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

queryDsl ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 05 24

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 05 57

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-17 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 06 33

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 ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋กํ•œ๋‹ค.

vs code ์—์„œ qclass ์ƒ์„ฑ์•ˆ๋˜๋Š”๊ฒฝ์šฐ

ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์—์„œ test runner for java , debug for java ๋ฒ„์ „์„ ๋‚ฎ์ถ”๊ฑฐ๋‚˜ , ์‚ฌ์šฉ์•ˆํ•จ์œผ๋กœ ํ•˜์…ˆ ์ด๊ฑฐ๋•Œ๋งค ๋ฉ˜ํƒˆ ๊ฐˆ๋ ธ๋‹ค

๊ฐ„ํ˜น vscode ์—์„œ

.vscode folder in .java is not on the classpath of project

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š”๊ฒฝ์šฐ pom.xml ์šฐํด๋ฆญํ•˜๊ณ , maven ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ € ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  Qclass ๋ฅผ ์ž„ํฌํŠธ ํ•ด์ค„์ˆ˜์žˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-21 แ„‹แ…ฉแ„’แ…ฎ 11 13 12

์œ„์™€๊ฐ™์ด q class ๋“ค์„ ์ฐธ์กฐํ• ์ˆ˜์žˆ๋‹ค.

๊ทธ๋ž˜๋„ ์•ˆ๋˜๋ฉด , pom์— ๋ช…์‹œ๋˜์–ด์žˆ๋Š” java version ๊ณผ , ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋ฒ„์ ผ์„ ํ™•์ธํ•ด๋ณธ๋‹ค.

queryDsl ์‚ฌ์šฉ (JpaQuery์ž„ ์ฟผ๋ฆฌํŒฉํ† ๋ฆฌ์•„๋‹˜)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-06-16 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 35 09

์ฐธ๊ณ ๋ฌธํ—Œ:https://www.inflearn.com/questions/35226

queryFactory ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ querydsl ์‚ฌ์šฉํ•˜๊ธฐ

ํ•„์ž๋Š” criteria query , jpaquery, jpaqueryFactory 3๊ฐœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์จ๋ดค์ง€๋งŒ jpaqueryFactory ๋ฅผ ์“ฐ๋Š” ์• ๋“ค๋„ ๋งŽ์€๊ฑฐ๊ฐ™๊ณ  ๋Œ€๋ถ€๋ถ„ ์ฟผ๋ฆฌํŒฉํ† ๋ฆฌ๋กœ ํ•˜๋Š”๊ฑฐ๊ฐ™๋‹ค ๊ฑ ์ด๊ฑฐ์จ๋ผ

์ด๋Ÿด๊ฑฐ๋ฉด ์™œ criteria , jpa query๋ฅผ ์™œ์ป๋ƒ ์ง€๊ธˆ๊นŒ์ง€

2gsjgna1uruvUuS7ndh9YqVwYGPLVszbFLwwpAYXZ1rkyz7vKAbhJvHdPRzCvhGfPWQdhkcqKLhnajnHFpGdgkDq3R1XmTFaFxUfKbVyyA3iDi1Fzv

์‚ฌ์‹ค jpa ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” jparepository๋งŒ ์“ฐ๋‹ค๊ฐ€ where ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ๊ฒ ๋‹คํ•ด์„œ ํ•ด์ฃผ๋‹ˆ๊นŒ ๋ญ” ๋ถ„๊ธฐ๋ณ„๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋˜์„œ ์ด๊ฑด์ข€...

ํ•˜๋‹ค๊ฐ€ criteria ๋ฅผ ์ฐพ๊ฒŒ๋˜์—ˆ๊ณ  ๋งˆ์นจ 1๋…„์ „์— ์Œฉ์‹ ์ž…๋•Œ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ criteria ๋ฅผ ์ž ๊น ์œ ์ง€๋ณด์ˆ˜ํ•œ์ ์ด ์žˆ์–ด์„œ ํ•ด๋ดค๋‹ค๊ฐ€ ์™€ ์ด๊ฑด ... ๊ฐ€๋…์„ฑ์ด ์“ฐ๋ ˆ๊ธฐ๋‹ค.. ์‹ถ์–ด์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ queryDsl ๋ณด๊ณ  .. querydsl ์—์„œ jpaquery ์“ฐ๋‹ค๊ฐ€ ๋‹ค๋“ค jpaqueryfactory ์“ฐ๊ณ ์žˆ์—ˆ๊ณ .. ์‘์‘.. ๋‚˜๋งŒ ์ง„์‹ฌ์ด์—ˆ์ง€..

queryDsl queryfactory ์—์„œ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ์•ˆ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ join ํ•˜๋Š”๋ฒ•

์›๋ž˜ 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);
    }

orderby , offset , limit , where condition

@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);
    }

subquery ์‚ฌ์šฉ

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์‹œ๊นŒ์ง€ ์‚ฝ์งˆํ•˜๊ณ  ์‚ฝ์งˆํ•˜๊ณ .. ๊ฒ€์ƒ‰๋„ ํ•ด๋ณด๊ณ  .. ๋ญ” ์ธ๋„์ธ์ด ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์„ค๋ช…ํ•˜๋Š” ์œ ํŠœ๋ธŒ ์˜์ƒ๋„ ๋ณด๊ณ  .. ํ•˜๋‚˜๋„ ์•ˆ๋“ค๋ฆฌ๋Š” ์ฝฉ๊ธ€๋ฆฌ์‹œ ์ธ๋„์ธ ์˜์–ด ์ฃผ๋จน๋ฌผ๊ณ  ์˜ค์—ดํ•˜๋ฉด์„œ ๋ณด๋ฉด์„œ.. ๋”ฐ๋ผํ•ด๋ณด๊ณ  ๊ทธ๋žฌ์ง€๋งŒ ๊ฒฐ๊ตญ์€ ์˜์กด์„ฑ์ฃผ์ž…์„ ์ž˜๋ชปํ•ด์คฌ๊ธฐ๋•Œ๋ฌธ์— ์ผ์–ด๋‚œ ๋Œ€์ฐธ์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ํ˜„์—…์—์„œ ์“ธ์ƒ๊ฐ์— ๋’ท๋ชฉ์žก๊ณ  ์“ฐ๋Ÿฌ์งˆ๊ฒƒ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ€๋Ÿ‰์„ ๋Š˜๋ ค์„œ๋ผ๋„ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์“ฐ๋„๋กํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

img

์ฐธ๊ณ  ๋ฌธํ—Œ

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 ๊ณต์‹์‚ฌ์ดํŠธ๋‹ค ์‹ ๋ขฐ๋„๊ฐ€ ์ œ์ผ๋†’๋‹ค

About

spring-data-jpa / hiber-nate/ boiler-plates

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages