Home

0

Spring Data JPA - 반환 타입

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 반환 타입List<Member> findListByUsername(String username); // 반환 타입 : 컬랙션Member findMemberByUsername(String username); // 반환 타입 : 단건Optional<Member> findOptionalByUsername(String useranme); // 반환 티입 : 단건 Optional public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUsernameAndAgeGreaterThan(String username, int age); @Query("select m from Member m where m.username = :username and m.age = :age") List<Member> findUser(@Param("username") String username, @Param("age") int age); // 값으로 조회하기 @Query("select m.username from Member m") List<String> findUsernameList(); // DTO로 조회하기 @Query("select new com.example.datajpa.dto.MemberDto( m.id, m.username, t.name)from Member m join m.team t") List<MemberDto> findMemberByDto(); @Query("select m from Member m where m.username in :names") List<Member> findByNames(@Param("names") Collection<String> names); List<Member> findListByUsername(String username); // 반환 타입 : 컬랙션 Member findMemberByUsername(String username); // 반환 타입 : 단건 Optional<Member> findOptionalByUsername(String useranme); // 반환 티입 : 단건 Optional} @Testpublic void returnType(){ Member member1 = new Member("AAA", 10); Member member2 = new Member("BBB", 20); memberRepository.save(member1); memberRepository.save(member2); List<Member> members = memberRepository.findListByUsername("AAA"); Member member = memberRepository.findMemberByUsername("AAA"); Optional<Member> optional = memberRepository.findOptionalByUsername("AAA"); assertThat(members).isInstanceOf(List.class); assertThat(member).isInstanceOf(Member.class); assertThat(optional).isInstanceOf(Optional.class);}

0

프로그래머스 - 순위 검색 (JAVA)

https://programmers.co.kr/learn/courses/30/lessons/72412 문제 풀이이 문제는 그냥 문자열대 문자열로 부딪히게 되면 시간 초과가 날 수 밖에 없는 문제다. 선형적으로 풀면 info 배열의 최대 크기는 5만, query 배열의 최대 크기는 10만 이므로 최대 50억 연산을 하게 되므로 효율성 측면에서 문제가 생긴다.결국 이 문제는 어떤 방법을 이용해 검색할 것인가가 가장 큰 관건이 된다. 선형적인 탐색을 하는 방법이 아닌 O(logn)의 시간 복잡도를 갖는 자료구조 혹은 탐색 기법을 이용하는 방법으로 문제를 접근해야 한다. 동시에 만들 수 있는 문장의 경우의 수를 고려해줘야 한다. 복합적인 문제라 쉽지 않다. 처음에 각 문자열내 문자들을 파싱해서 map에다가 저장을 해야 하나?…. 그러면 탐색을 어떻게 해야하지?… 하면서 문제 접근을 못하다가 다른 분 풀이를 살짝 참고 했는데 문자열 자체를 map의 key값으로 넣는 것을 보고 힌트를 얻어 문제를 접근할 수 있었다. info 내 문자열을 정재해 띄어쓰기는 문장을 만들어준다. key로 정재된 문장을 value로는 같은 key를 갖는 문장에 대한 값들을 보관하기 위해 List형태로 넣어준다. info 내 문장들이 map으로 다 들어갔으면 Binary Search를 사용하기 위해 오름 차순으로 정렬 해준다. query 내 문자열을 정재해 준다. info에서 구분자는 띄어쓰기 였지만 query에서 구분자는 and와 띄어쓰기다. ‘-‘를 만나게 되면 만들 수 있는 문장의 모든 경우의 수를 만들어준다. 정재된 문자를 갖고 info에 값이 있는지 확인한다. 값이 있으면 List에서 query에서 요구하는 값 이상이 되는 사람 수를 찾는다.(Lower Bound) 쿼리가 여러개인 경우는 각각의 경우들을 모두 찾아서 더해준다. 찾은 결과를 answer에 넣어 반환한다. info 내 문자열을 정재하기public void infoToMap(String[] info) { for (int i = 0; i < info.length; i++) { String[] words = info[i].split(" "); StringBuilder sb = new StringBuilder(); int score = Integer.parseInt(words[words.length - 1]); for (int j = 0; j < words.length - 1; j++) { sb.append(words[j]); } String key = sb.toString(); infos.computeIfAbsent(key, k -> new ArrayList<>()).add(score); }} map 내 List값들을 오름차순으로 정렬하기infos.forEach((key, value) -> { value.sort(null);});

0

Spring Data JPA - Query 파라미터 바인딩

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 JPQL에 파라미터 바인딩Param 어노테이션을 이용해 쿼리문내 파라미터들을 바인딩 해준다. @Query("select m from Member m where m.username = :username and m.age = :age")List<Member> findUser(@Param("username") String username, @Param("age") int age); 컬렉션 파리미터 바인딩Collection 타입으로 in 절 지원 @Query("select m from Member m where m.username in :names")List<Member> findByNames(@Param("names") List<String> names); @Testpublic void findByNames(){ Member member1 = new Member("AAA", 10); Member member2 = new Member("BBB", 20); memberRepository.save(member1); memberRepository.save(member2); List<Member> result = memberRepository.findByNames(Arrays.asList("AAA", "BBB")); for (Member member : result) { System.out.println("Member : " + member); }}

0

Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 @Query 를 이용한 조회 결과를 특정 값으로 반환하기 DB로 부터 조회한 결과에서 객체의 특정 값만 가져오고 싶은 경우 객체에서 feild값을 조회 하듯이 객체.field 형식으로 명시해주면 해당 값을 가져올 수 있다. 반환 형식으로는 해당 field의 데이터 형식에 맞춰주면 된다. @Query("select m.username from Member m")List<String> findUsernameList(); public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUsernameAndAgeGreaterThan(String username, int age); @Query("select m from Member m where m.username = :username and m.age = :age") List<Member> findUser(@Param("username") String username, @Param("age") int age); @Query("select m.username from Member m") List<String> findUsernameList();} @Testpublic void findUsernameList() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); List<String> memberNames = memberRepository.findUsernameList(); for (String name : memberNames) { System.out.println("Username : " + name); }} DTO를 사용해 @Query 작성하기일반적으로 DB에서 데이터를 조회할 때 Entity 모든 값보다는 필요한 값 몇가지만을 가져오는 경우가 많다. 이렇게 필요한 데이터 만을 가져올 수 있도록 DTO class를 정의하고 DTO를 이용해 Entity에서 필요한 데이터만을 조회하는 방법이 더 효율적으로 데이터를 가져오는 방식이다. DTO를 이용해 해당 Entity에서 필요한 데이터만을 조회할 수 있도록 구현해보자!

0

Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 JPQL (Java Persistence Query Lange) 사용하기 Table 대상이 아닌 Etity(객체) 를 대상으로 작성하는 객체 지향 쿼리 특정 데이터 베이스 SQL에 의존하지 않는 장점이 있다. EntityManager 객체 createQuery 메소드를 사용해 쿼리문을 만들어 줄 수 있다. select 문으로 데이터 조회 후 List, Stream, 단건 데이터 3가지 방식으로 결과를 가져올 수 있다. 메소드 설명 getResultList select 문 실행후 여러 Row 결과 데이터를 List로 반환한다. getResultStream select 문 실행후 여러 Row 결과 데이터를 Stream 으로 반환한다. getSingleResult select 문 실행후 한 Row 결과 데이터를 반환한다. // Readpublic List<Member> findAll() { // JPQL List<Member> result = em.createQuery("select m from Member m", Member.class) .getResultList(); return result;} public long count() { return em.createQuery("select count(m) from Member m", Long.class) .getSingleResult();} public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m " + "where m.username = :username " + "and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList();}

0

Spring Data JPA - 메소드 이름으로 쿼리 생성하기

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 메소드 이름으로 쿼리 생성하기https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation @Testpublic void findByUsernameAndAgeGreaterThen(){ Member member1 = new Member("AAA", 10); Member member2 = new Member("AAA", 20); memberJpaRepository.save(member1); memberJpaRepository.save(member2); List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThan("AAA", 15); assertThat(result.get(0).getUsername()).isEqualTo("AAA"); assertThat(result.get(0).getAge()).isEqualTo(20); assertThat(result.size()).isEqualTo(1);} List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

0

Spring Data JPA - 시작하기

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 Spring Data JPA 시작하기JPA를 사용해 Repository 구성하기스프링에서 EntityManager 는 다른 Bean들과는 다르게 PersistenceContext 어노테이션을 이용해 객체를 주입 받는다.EntityManager 를 이용해 간단하게 CRUD를 구현할 수 있다. persist : Create remove : Delete find : Read @Repositorypublic class MemberRepository{ @PersistenceContext private EntityManager em; // Create public Member save(Member member){ em.persist(member); // DB 에 데이터 저장 return member; } // Delete public void delete(Member member) { em.remove(member); // DB 에 저장된 데이터 삭제 } // Read public Member find(Long id){ Member member = em.find(Member.class, id); // DB 에 저장된 데이터 조회 return member; }} 스프링에서 제공하는 JpaRepository를 사용스프링에서 제공하는 JpaRepository 를 사용하게 되면 기본적인 CRUD 기능을 만들어주기 때문에 보다 간편하게 데이터를 조회할 수 있다.

0

프로그래머스 - 메뉴 리뉴얼 (JAVA)

https://programmers.co.kr/learn/courses/30/lessons/72411 문제 풀이처음에 문자열 비교로 접근해 엄청 해멨다. 이 문제는 문자열 비교로 접근을 하는게 아니라 한 사람이 시킨 메뉴 코스를 이용해 만들 수 있는 경우의 수를 만들어 비교하는 문제다. 코스를 사전 순서로 저장할 수 있도록 주문을 정렬해준다. 한 손님이 주문한 단품 메뉴들로 만들 수 있는 모든 코스 조합을 만들어준다. 코스내 메뉴 개수에 따라 가장 많이 선택된 횟수를 저장해 놓는다. 코스를 선택할때 코스내 메뉴가 메뉴 개수에서 가장 많이 선택된 횟수와 같다면 넣어준다. 모든 코스를 만들어주는 함수public void findAllCourse(String order, String subOrder, int depth) { if (depth == order.length()) { if (subOrder.length() > 1) { if (map.containsKey(subOrder)) { int value = map.get(subOrder); map.put(subOrder, value + 1); } else { map.put(subOrder, 1); } } return; } findAllCourse(order, subOrder + order.charAt(depth), depth + 1); findAllCourse(order, subOrder, depth + 1);} 전체 소스import java.io.*;import java.util.*;class Solution { Map<String, Integer> map = new TreeMap<>(); public void findAllCourse(String order, String subOrder, int depth) { if (depth == order.length()) { if (subOrder.length() > 1) { if (map.containsKey(subOrder)) { int value = map.get(subOrder); map.put(subOrder, value + 1); } else { map.put(subOrder, 1); } } return; } findAllCourse(order, subOrder + order.charAt(depth), depth + 1); findAllCourse(order, subOrder, depth + 1); } public String[] solution(String[] orders, int[] course) { for (String order : orders) { // 문자열내 문자들을 사전 순서대로 정렬 char[] charArr = order.toCharArray(); Arrays.sort(charArr); String sortedOrder = new String(charArr); // 주문한 메뉴들로 만들 수 있는 모든 코스 조합을 만들어준다. findAllCourse(sortedOrder, "", 0); } int[] maxValues = new int[101]; ArrayList<String> result = new ArrayList<>(); map.forEach((key, value) -> maxValues[key.length()] = Math.max(maxValues[key.length()], value)); map.forEach((key, value) -> { if (value >= maxValues[key.length()] && value > 1) { for (int i = 0; i < course.length; i++) { if (course[i] == key.length()) { result.add(key); } } } }); String[] answer = new String[result.size()]; int index = 0; for (String s : result) { answer[index++] = s; } return answer; }}

0

프로그래머스 - 메뉴 리뉴얼 (Cpp)

https://programmers.co.kr/learn/courses/30/lessons/72411 문제 풀이처음에 문자열 비교로 접근해 엄청 해멨다. 이 문제는 문자열 비교로 접근을 하는게 아니라 한 사람이 시킨 메뉴 코스를 이용해 만들 수 있는 경우의 수를 만들어 비교하는 문제다. 코스를 사전 순서로 저장할 수 있도록 주문을 정렬해준다. 한 손님이 주문한 단품 메뉴들로 만들 수 있는 모든 코스 조합을 만들어준다. 코스내 메뉴 개수에 따라 가장 많이 선택된 횟수를 저장해 놓는다. 코스를 선택할때 코스내 메뉴가 메뉴 개수에서 가장 많이 선택된 횟수와 같다면 넣어준다. 모든 코스 조합을 만들어주는 함수void makeAllCourse(string subOrder, string order, int depth) { if (depth > order.size()) { return; } if (depth == order.size() && subOrder.size() > 1) { if (m.find(subOrder) == m.end()) { m[subOrder] = 1; } else { m[subOrder] += 1; } } // 현재 메뉴를 선택하고 다음 메뉴로 넘어간다. makeAllCourse(subOrder + order[depth], order, depth + 1); // 현재 메뉴를 선택하지 않고 다음 메뉴로 넘어간다. makeAllCourse(subOrder, order, depth + 1);} 전체 소스#include <bits/stdc++.h>using namespace std;map<string, int> m;int maxValues[100];void makeAllCourse(string subOrder, string order, int depth) { if (depth > order.size()) { return; } if (depth == order.size() && subOrder.size() > 1) { if (m.find(subOrder) == m.end()) { m[subOrder] = 1; } else { m[subOrder] += 1; } } makeAllCourse(subOrder + order[depth], order, depth + 1); makeAllCourse(subOrder, order, depth + 1);}vector<string> solution(vector<string> orders, vector<int> course) { vector<string> answer; for (int i = 0; i < orders.size(); i++) { sort(orders[i].begin(), orders[i].end()); makeAllCourse("", orders[i], 0); } for (auto iter = m.begin(); iter != m.end(); iter++) { int courseCount = iter->first.length(); maxValues[courseCount] = max(maxValues[courseCount], iter->second); } for (auto iter = m.begin(); iter != m.end(); iter++) { int courseCount = iter->first.length(); if (iter->second == maxValues[courseCount] && iter->second >= 2) { for (int i = 0; i < course.size(); i++) { if (courseCount == course[i]) { answer.push_back(iter->first); } } } } return answer;}

0

백준 2178 - 미로탐색

링크https://www.acmicpc.net/problem/2178 문제 풀이기본적인 BFS 문제다. 조건에 맞춰 값을 읽어온 후 탐색을 진행하면 원하는 값을 얻을 수 있다. 전체 소스import java.io.BufferedReader;import java.io.IOError;import java.io.IOException;import java.io.InputStreamReader;import java.util.LinkedList;import java.util.Queue;public class Main { public static int height, width; public static int[] dx = { 0, 0, 1, -1 }; public static int[] dy = { 1, -1, 0, 0 }; public static int[][] map; public static int bfs() { Queue<int[]> q = new LinkedList<>(); boolean check[][] = new boolean[height + 1][width + 1]; q.offer(new int[] { 0, 0 }); check[0][0] = true; int count = 0; while (!q.isEmpty()) { int qSize = q.size(); count++; while (qSize-- > 0) { int[] point = q.remove(); int cntY = point[0]; int cntX = point[1]; if (cntY == height - 1 && cntX == width - 1) { return count; } for (int i = 0; i < 4; i++) { int nY = cntY + dy[i]; int nX = cntX + dx[i]; if (0 <= nY && nY < height && 0 <= nX && nX < width) { if (check[nY][nX] == false && map[nY][nX] == 1) { check[nY][nX] = true; q.offer(new int[] { nY, nX }); } } } } } return count; } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] inputValues = br.readLine().split(" "); height = Integer.parseInt(inputValues[0]); width = Integer.parseInt(inputValues[1]); map = new int[height + 1][width + 1]; for (int h = 0; h < height; h++) { String inputValue = br.readLine(); for (int w = 0; w < width; w++) { // System.out.println(inputValue.charAt(w)); map[h][w] = inputValue.charAt(w) - '0'; } } int count = bfs(); System.out.println(count); br.close(); }}