From c1595217920caae9b36a953d15387ace13f5d681 Mon Sep 17 00:00:00 2001 From: jshans40 Date: Fri, 8 Nov 2024 22:32:29 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20SELECT,=20INSERT=20=EC=BF=BC=EB=A6=AC=20=EB=B0=8F?= =?UTF-8?q?=20=EC=98=81=EC=86=8D=EC=84=B1=20=EC=BB=A8=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jpa/EntityManagerImpl.java | 15 ++++ .../sql/ddl/CreateQueryBuilder.java | 32 ++++---- .../java/persistence/sql/ddl/DDLColumn.java | 6 +- .../java/persistence/sql/dml/InsertQuery.java | 3 + .../java/persistence/sql/dml/SelectQuery.java | 33 +++++--- .../persistence/sql/entity/EntityFields.java | 5 ++ .../persistence/sql/entity/EntityJoin.java | 75 +++++++++++++++++++ .../sql/entity/EntityJoinInfo.java | 60 +++++++++++++++ .../sql/entity/EntityRowMapper.java | 1 + .../java/persistence/sql/entity/Order.java | 34 +++++++++ .../persistence/sql/entity/OrderItem.java | 28 +++++++ .../sql/model/EntityColumnNames.java | 10 ++- .../java/persistence/sql/model/EntityId.java | 5 ++ .../java/persistence/sql/model/Operator.java | 20 +++++ .../java/persistence/sql/model/TableName.java | 7 ++ .../persistence/sql/model/WhereClause.java | 21 ++++++ .../sql/ddl/H2CreateQueryBuilderTest.java | 8 ++ src/test/java/sql/dml/SelectQueryTest.java | 14 +++- .../sql/entity/EntityManagerImplTest.java | 28 +++++++ .../java/sql/model/EntityColumnNamesTest.java | 2 +- 20 files changed, 376 insertions(+), 31 deletions(-) create mode 100644 src/main/java/persistence/sql/entity/EntityJoin.java create mode 100644 src/main/java/persistence/sql/entity/EntityJoinInfo.java create mode 100644 src/main/java/persistence/sql/entity/Order.java create mode 100644 src/main/java/persistence/sql/entity/OrderItem.java create mode 100644 src/main/java/persistence/sql/model/Operator.java create mode 100644 src/main/java/persistence/sql/model/WhereClause.java diff --git a/src/main/java/jpa/EntityManagerImpl.java b/src/main/java/jpa/EntityManagerImpl.java index 26609323..08e139bb 100644 --- a/src/main/java/jpa/EntityManagerImpl.java +++ b/src/main/java/jpa/EntityManagerImpl.java @@ -1,5 +1,9 @@ package jpa; +import persistence.sql.entity.EntityJoin; + +import java.util.Collection; + public class EntityManagerImpl implements EntityManager { private final EntityPersister entityPersister; private final PersistenceContext persistenceContext; @@ -31,9 +35,20 @@ public T persist(T entity) { T insertedEntity = entityPersister.insert(entity); persistenceContext.add(entity); persistenceContext.createDatabaseSnapshot(entity); + + persistJoinEntity(entity); + return insertedEntity; } + private void persistJoinEntity(T entity) { + EntityJoin entityJoin = new EntityJoin(entity.getClass()); + entityJoin.getEntityJoinInfos().forEach(entityJoinInfo -> { + Collection entityJoinCollections = entityJoinInfo.getEntityJoinCollections(entity); + entityJoinCollections.forEach(this::persist); + }); + } + @Override public void merge(Object entity) { if (persistenceContext.isDirty(entity)) { diff --git a/src/main/java/persistence/sql/ddl/CreateQueryBuilder.java b/src/main/java/persistence/sql/ddl/CreateQueryBuilder.java index 4f22b336..add6cf17 100644 --- a/src/main/java/persistence/sql/ddl/CreateQueryBuilder.java +++ b/src/main/java/persistence/sql/ddl/CreateQueryBuilder.java @@ -1,11 +1,17 @@ package persistence.sql.ddl; import jakarta.persistence.Entity; +import jakarta.persistence.JoinTable; import persistence.sql.Dialect; +import persistence.sql.entity.EntityJoin; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredClassException; import persistence.sql.model.TableName; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + public class CreateQueryBuilder implements QueryBuilder { private static final String LEFT_PARENTHESIS = "("; private static final String RIGHT_PARENTHESIS = ")"; @@ -13,6 +19,7 @@ public class CreateQueryBuilder implements QueryBuilder { private final Class clazz; private final Dialect dialect; + private final List createQueries = new ArrayList<>(); public CreateQueryBuilder(Class clazz, Dialect dialect) { if (clazz == null) { @@ -30,14 +37,18 @@ public CreateQueryBuilder(Class clazz, Dialect dialect) { @Override public String build() { StringBuilder makeStringBuilder = new StringBuilder(); - makeStringBuilder.append(createTableIfNotExistsStatement()); - makeStringBuilder.append(generateColumnDefinitions()); - return makeStringBuilder.toString(); + makeStringBuilder.append(createTableIfNotExistsStatement(this.clazz)); + makeStringBuilder.append(LEFT_PARENTHESIS); + makeStringBuilder.append(generateColumnDefinitions(this.clazz)); + makeStringBuilder.append(RIGHT_PARENTHESIS); + createQueries.add(makeStringBuilder.toString()); + + + return String.join(";", createQueries); } - private String createTableIfNotExistsStatement() { + private String createTableIfNotExistsStatement(Class clazz) { TableName tableName = new TableName(clazz); - StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("CREATE TABLE IF NOT EXISTS"); stringBuilder.append(SPACE); @@ -46,14 +57,9 @@ private String createTableIfNotExistsStatement() { return stringBuilder.toString(); } - private String generateColumnDefinitions() { - DDLColumn ddlColumns = new DDLColumn(this.clazz.getDeclaredFields(), dialect); - - StringBuilder columnDefinitionStringBuilder = new StringBuilder(); - columnDefinitionStringBuilder.append(LEFT_PARENTHESIS); - columnDefinitionStringBuilder.append(ddlColumns.makeColumnsDDL()); - columnDefinitionStringBuilder.append(RIGHT_PARENTHESIS); - return columnDefinitionStringBuilder.toString(); + private String generateColumnDefinitions(Class clazz) { + DDLColumn ddlColumns = new DDLColumn(clazz.getDeclaredFields(), dialect); + return ddlColumns.makeColumnsDDL(); } diff --git a/src/main/java/persistence/sql/ddl/DDLColumn.java b/src/main/java/persistence/sql/ddl/DDLColumn.java index 02b70c87..bdd28e5a 100644 --- a/src/main/java/persistence/sql/ddl/DDLColumn.java +++ b/src/main/java/persistence/sql/ddl/DDLColumn.java @@ -1,9 +1,6 @@ package persistence.sql.ddl; -import jakarta.persistence.Column; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.Transient; +import jakarta.persistence.*; import persistence.sql.Dialect; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredFieldException; @@ -42,6 +39,7 @@ public DDLColumn(Field[] fields, Dialect dialect) { this.fields = new ArrayList<>(Arrays.asList(fields)) .stream() .filter(field -> !field.isAnnotationPresent(Transient.class)) + .filter(field -> !field.isAnnotationPresent(OneToMany.class)) .collect(Collectors.toList()); } diff --git a/src/main/java/persistence/sql/dml/InsertQuery.java b/src/main/java/persistence/sql/dml/InsertQuery.java index 1674febf..a281a9ce 100644 --- a/src/main/java/persistence/sql/dml/InsertQuery.java +++ b/src/main/java/persistence/sql/dml/InsertQuery.java @@ -1,6 +1,7 @@ package persistence.sql.dml; import jakarta.persistence.GeneratedValue; +import jakarta.persistence.OneToMany; import jakarta.persistence.Transient; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredObjectException; @@ -42,6 +43,7 @@ private String columnsClause(Object object) { return Arrays.stream(object.getClass().getDeclaredFields()) .filter(field -> !field.isAnnotationPresent(Transient.class)) .filter(field -> !field.isAnnotationPresent(GeneratedValue.class)) + .filter(field -> !field.isAnnotationPresent(OneToMany.class)) .map(field -> new EntityColumnName(field).getValue()) .collect(Collectors.joining(", ")); } @@ -50,6 +52,7 @@ private String valueClause(Object object) { return Arrays.stream(object.getClass().getDeclaredFields()) .filter(field -> !field.isAnnotationPresent(Transient.class)) .filter(field -> !field.isAnnotationPresent(GeneratedValue.class)) + .filter(field -> !field.isAnnotationPresent(OneToMany.class)) .map(field -> getValueInClause(object, field)) .collect(Collectors.joining(", ")); } diff --git a/src/main/java/persistence/sql/dml/SelectQuery.java b/src/main/java/persistence/sql/dml/SelectQuery.java index beddef7f..d6e2b91e 100644 --- a/src/main/java/persistence/sql/dml/SelectQuery.java +++ b/src/main/java/persistence/sql/dml/SelectQuery.java @@ -1,9 +1,10 @@ package persistence.sql.dml; +import persistence.sql.entity.EntityJoin; +import persistence.sql.entity.EntityJoinInfo; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredClassException; -import persistence.sql.model.EntityColumnNames; -import persistence.sql.model.TableName; +import persistence.sql.model.*; public class SelectQuery { @@ -26,7 +27,7 @@ public String findAll(Class clazz) { TableName tableName = new TableName(clazz); EntityColumnNames entityColumnNames = new EntityColumnNames(clazz); - return String.format("SELECT %s FROM %s", entityColumnNames.getColumnNames(), tableName.getValue()); + return String.format("SELECT %s FROM %s %s", entityColumnNames.getColumnNames(), tableName.getValue(), tableName.getAlias()); } @@ -41,21 +42,35 @@ public String findById(Class clazz, Object id) { TableName tableName = new TableName(clazz); EntityColumnNames entityColumnNames = new EntityColumnNames(clazz); + EntityJoin entityJoin = new EntityJoin(clazz); + StringBuilder findByIdQueryStringBuilder = new StringBuilder(); findByIdQueryStringBuilder.append("SELECT"); findByIdQueryStringBuilder.append(SPACE); findByIdQueryStringBuilder.append(entityColumnNames.getColumnNames()); + + for (Class joinClass : entityJoin.getJoinClasses()) { + EntityColumnNames joinEntityColumnNames = new EntityColumnNames(joinClass); + findByIdQueryStringBuilder.append(","); + findByIdQueryStringBuilder.append(SPACE); + findByIdQueryStringBuilder.append(joinEntityColumnNames.getColumnNames()); + } + findByIdQueryStringBuilder.append(SPACE); findByIdQueryStringBuilder.append("FROM"); findByIdQueryStringBuilder.append(SPACE); - findByIdQueryStringBuilder.append(tableName.getValue()); + findByIdQueryStringBuilder.append(String.format("%s %s", tableName.getValue(), tableName.getAlias())); + + if (entityJoin.isEntityJoin()) { + findByIdQueryStringBuilder.append(SPACE); + findByIdQueryStringBuilder.append(entityJoin.makeJoinTableQuery()); + findByIdQueryStringBuilder.append(SPACE); + } + findByIdQueryStringBuilder.append(SPACE); - findByIdQueryStringBuilder.append("WHERE"); - findByIdQueryStringBuilder.append(" "); - findByIdQueryStringBuilder.append("id="); - findByIdQueryStringBuilder.append(id); + WhereClause whereClause = new WhereClause("id", Operator.equals, id, tableName.getAlias()); + findByIdQueryStringBuilder.append(whereClause.makeWhereQuery()); return findByIdQueryStringBuilder.toString(); } - } diff --git a/src/main/java/persistence/sql/entity/EntityFields.java b/src/main/java/persistence/sql/entity/EntityFields.java index c0635108..14f89d7f 100644 --- a/src/main/java/persistence/sql/entity/EntityFields.java +++ b/src/main/java/persistence/sql/entity/EntityFields.java @@ -33,5 +33,10 @@ public List getIdFields() { .collect(Collectors.toList()); } + public String getIdFieldName() { + return getIdFields().get(0).getName(); + } + + } diff --git a/src/main/java/persistence/sql/entity/EntityJoin.java b/src/main/java/persistence/sql/entity/EntityJoin.java new file mode 100644 index 00000000..abaf78f5 --- /dev/null +++ b/src/main/java/persistence/sql/entity/EntityJoin.java @@ -0,0 +1,75 @@ +package persistence.sql.entity; + +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import persistence.sql.model.EntityId; +import persistence.sql.model.TableName; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class EntityJoin { + + private final List entityJoinInfos = new ArrayList<>(); + private final EntityId entityId; + + public EntityJoin(Class clazz) { + addEntityJoinInfos(clazz); + this.entityId = new EntityId(clazz); + } + + public void addEntityJoinInfos(Class clazz) { + Arrays.stream(clazz.getDeclaredFields()) + .filter(x -> x.isAnnotationPresent(OneToMany.class)) + .forEach(field -> { + OneToMany oneToMany = field.getAnnotation(OneToMany.class); + JoinColumn joinColumn = field.getAnnotation(JoinColumn.class); + + Type genericType = field.getGenericType(); + Type[] types = ((ParameterizedType) genericType).getActualTypeArguments(); + entityJoinInfos.add( + new EntityJoinInfo( + (Class) types[0], + clazz, + new EntityId(clazz).getIdColumnName(), + oneToMany.fetch(), + joinColumn.name(), + field + ) + ); + }); + } + + public boolean isEntityJoin() { + return !entityJoinInfos.isEmpty(); + } + + public String makeJoinTableQuery() { + StringBuilder joinQueryBuilder = new StringBuilder(); + entityJoinInfos.forEach(entityJoinInfo -> { + joinQueryBuilder.append("LEFT JOIN "); + joinQueryBuilder.append(entityJoinInfo.getJoinTableName()); + joinQueryBuilder.append(" ON "); + joinQueryBuilder.append(new TableName(entityJoinInfo.getClazz()).getAlias()); + joinQueryBuilder.append("."); + joinQueryBuilder.append(entityId.getIdColumnName()); + joinQueryBuilder.append(" = "); + joinQueryBuilder.append(new TableName(entityJoinInfo.getJoinClazz()).getAlias()); + joinQueryBuilder.append("."); + joinQueryBuilder.append(entityJoinInfo.getJoinColumnName()); + }); + return joinQueryBuilder.toString(); + } + + public List> getJoinClasses() { + return this.entityJoinInfos.stream().map(EntityJoinInfo::getJoinClazz).collect(Collectors.toList()); + } + + public List getEntityJoinInfos() { + return entityJoinInfos; + } +} diff --git a/src/main/java/persistence/sql/entity/EntityJoinInfo.java b/src/main/java/persistence/sql/entity/EntityJoinInfo.java new file mode 100644 index 00000000..f786e3f0 --- /dev/null +++ b/src/main/java/persistence/sql/entity/EntityJoinInfo.java @@ -0,0 +1,60 @@ +package persistence.sql.entity; + +import jakarta.persistence.FetchType; +import persistence.sql.model.TableName; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; + +public class EntityJoinInfo { + + private final String joinTableName; + private final String columnName; + private final String joinColumnName; + private final Class joinClazz; + private final Class clazz; + private final Field joinField; + private final FetchType fetchType; + + public EntityJoinInfo(Class joinClazz, Class clazz, String columnName, FetchType fetchType, String joinColumnName, Field joinField) { + this.joinClazz = joinClazz; + TableName joinTableName = new TableName(joinClazz); + this.joinTableName = joinTableName.getValue(); + this.columnName = columnName; + this.joinColumnName = joinColumnName; + this.clazz = clazz; + this.joinField = joinField; + this.fetchType = fetchType; + } + + + public String getJoinColumnName() { + return joinColumnName; + } + + public String getJoinTableName() { + return joinTableName; + } + + public Class getJoinClazz() { + return this.joinClazz; + } + + public Class getClazz() { + return clazz; + } + + public String getColumnName() { + return columnName; + } + + public Collection getEntityJoinCollections(Object entityObject) { + try { + this.joinField.setAccessible(true); + return (Collection) this.joinField.get(entityObject); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/persistence/sql/entity/EntityRowMapper.java b/src/main/java/persistence/sql/entity/EntityRowMapper.java index d8962fa2..0d428114 100644 --- a/src/main/java/persistence/sql/entity/EntityRowMapper.java +++ b/src/main/java/persistence/sql/entity/EntityRowMapper.java @@ -45,6 +45,7 @@ private void setFields(Object object, ResultSet resultSet) { private void setField(Field field, Object object, ResultSet resultSet) { try { field.setAccessible(true); + field.set(object, resultSet.getObject(new EntityColumnName(field).getValue())); } catch (IllegalAccessException e) { throw new RuntimeException(e); diff --git a/src/main/java/persistence/sql/entity/Order.java b/src/main/java/persistence/sql/entity/Order.java new file mode 100644 index 00000000..5d0de557 --- /dev/null +++ b/src/main/java/persistence/sql/entity/Order.java @@ -0,0 +1,34 @@ +package persistence.sql.entity; + +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "orders") +public class Order { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String orderNumber; + + @OneToMany(fetch = FetchType.EAGER) + @JoinColumn(name = "order_id") + private List orderItems; + + public Order() { + + } + + public Order(String orderNumber) { + this.orderNumber = orderNumber; + this.orderItems = new ArrayList<>(); + } + + public List getOrderItems() { + return orderItems; + } +} diff --git a/src/main/java/persistence/sql/entity/OrderItem.java b/src/main/java/persistence/sql/entity/OrderItem.java new file mode 100644 index 00000000..820f396e --- /dev/null +++ b/src/main/java/persistence/sql/entity/OrderItem.java @@ -0,0 +1,28 @@ +package persistence.sql.entity; + +import jakarta.persistence.*; + +@Entity +@Table(name = "order_items") +public class OrderItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String product; + + private Integer quantity; + + @Column(name = "order_id") + private Long orderId; + + public OrderItem() { + + } + + public OrderItem(String product, Integer quantity) { + this.product = product; + this.quantity = quantity; + } +} diff --git a/src/main/java/persistence/sql/model/EntityColumnNames.java b/src/main/java/persistence/sql/model/EntityColumnNames.java index e4b95b17..51951995 100644 --- a/src/main/java/persistence/sql/model/EntityColumnNames.java +++ b/src/main/java/persistence/sql/model/EntityColumnNames.java @@ -1,6 +1,8 @@ package persistence.sql.model; import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import jakarta.persistence.Transient; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredClassException; @@ -15,6 +17,7 @@ public class EntityColumnNames { private final List entityColumnNames; private final Class clazz; + private final String alias; public EntityColumnNames(Class clazz) { if (clazz == null) { @@ -23,14 +26,17 @@ public EntityColumnNames(Class clazz) { this.clazz = clazz; this.entityColumnNames = Arrays.stream(clazz.getDeclaredFields()) - .filter(field -> !field.isAnnotationPresent(Transient.class)) + .filter( + field -> !field.isAnnotationPresent(Transient.class) && !field.isAnnotationPresent(OneToMany.class) + ) .map(EntityColumnName::new) .collect(Collectors.toList()); + this.alias = new TableName(clazz).getAlias(); } public String getColumnNames() { return this.entityColumnNames.stream() - .map(EntityColumnName::getValue) + .map(entityColumnName -> String.format("%s.%s", this.alias, entityColumnName.getValue())) .collect(Collectors.joining(", ")); } diff --git a/src/main/java/persistence/sql/model/EntityId.java b/src/main/java/persistence/sql/model/EntityId.java index b433b490..64515cad 100644 --- a/src/main/java/persistence/sql/model/EntityId.java +++ b/src/main/java/persistence/sql/model/EntityId.java @@ -42,4 +42,9 @@ public Class getIdType() { Field idField = getIdField(); return idField.getType(); } + + public String getIdColumnName() { + Field idField = getIdField(); + return new EntityColumnName(idField).getValue(); + } } diff --git a/src/main/java/persistence/sql/model/Operator.java b/src/main/java/persistence/sql/model/Operator.java new file mode 100644 index 00000000..ab027195 --- /dev/null +++ b/src/main/java/persistence/sql/model/Operator.java @@ -0,0 +1,20 @@ +package persistence.sql.model; + +public enum Operator { + equals("="), + notEquals("!="), + greaterThan(">"), + greaterThanOrEquals(">="), + lessThan("<"), + lessThanOrEquals("<="); + + String value; + + Operator(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/persistence/sql/model/TableName.java b/src/main/java/persistence/sql/model/TableName.java index 1786bb4e..bf9aade0 100644 --- a/src/main/java/persistence/sql/model/TableName.java +++ b/src/main/java/persistence/sql/model/TableName.java @@ -6,6 +6,7 @@ public class TableName { private final String value; + private final String alias; public TableName(Class clazz) { if (clazz == null) { @@ -13,6 +14,7 @@ public TableName(Class clazz) { } this.value = getTableName(clazz); + this.alias = getTableName(clazz).toLowerCase(); } private String getTableName(Class clazz) { @@ -31,4 +33,9 @@ private String getTableName(Class clazz) { public String getValue() { return this.value; } + + public String getAlias() { + return alias; + } + } diff --git a/src/main/java/persistence/sql/model/WhereClause.java b/src/main/java/persistence/sql/model/WhereClause.java new file mode 100644 index 00000000..f7c97a7f --- /dev/null +++ b/src/main/java/persistence/sql/model/WhereClause.java @@ -0,0 +1,21 @@ +package persistence.sql.model; + +public class WhereClause { + + private final String columnName; + private final Operator operator; + private final Object value; + private final String tableAlias; + + public WhereClause(String columnName, Operator operator, Object value, String tableAlias) { + this.columnName = columnName; + this.operator = operator; + this.value = value; + this.tableAlias = tableAlias; + } + + public String makeWhereQuery() { + return String.format("WHERE %s.%s %s %s", tableAlias, columnName, operator.getValue(), value); + } + +} diff --git a/src/test/java/sql/ddl/H2CreateQueryBuilderTest.java b/src/test/java/sql/ddl/H2CreateQueryBuilderTest.java index 4bd0f116..60455f60 100644 --- a/src/test/java/sql/ddl/H2CreateQueryBuilderTest.java +++ b/src/test/java/sql/ddl/H2CreateQueryBuilderTest.java @@ -7,6 +7,7 @@ import persistence.sql.ddl.CreateQueryBuilder; import persistence.sql.ddl.Person; import persistence.sql.ddl.QueryBuilder; +import persistence.sql.entity.Order; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredClassException; @@ -31,4 +32,11 @@ class H2CreateQueryBuilderTest { .isInstanceOf(RequiredClassException.class) .hasMessage(ExceptionMessage.REQUIRED_CLASS.getMessage()); } + + @Test + void test() { + QueryBuilder orderCreateQueryBuilder = new CreateQueryBuilder(Order.class, dialect); + String sql = orderCreateQueryBuilder.build(); + System.out.println("sql = " + sql); + } } diff --git a/src/test/java/sql/dml/SelectQueryTest.java b/src/test/java/sql/dml/SelectQueryTest.java index 73ee9bc7..ddab3af9 100644 --- a/src/test/java/sql/dml/SelectQueryTest.java +++ b/src/test/java/sql/dml/SelectQueryTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import persistence.sql.ddl.Person; import persistence.sql.dml.SelectQuery; +import persistence.sql.entity.Order; import persistence.sql.exception.ExceptionMessage; import persistence.sql.exception.RequiredClassException; @@ -14,7 +15,7 @@ class SelectQueryTest { @Test void SELECT_쿼리_조회() { SelectQuery selectQuery = SelectQuery.getInstance(); - assertThat(selectQuery.findAll(Person.class)).isEqualTo("SELECT id, nick_name, old, email FROM users"); + assertThat(selectQuery.findAll(Person.class)).isEqualTo("SELECT users.id, users.nick_name, users.old, users.email FROM users users"); } @Test @@ -27,7 +28,16 @@ class SelectQueryTest { @Test void 아이디로_조회_쿼리() { SelectQuery selectQuery = SelectQuery.getInstance(); - assertThat(selectQuery.findById(Person.class, 1L)).isEqualTo("SELECT id, nick_name, old, email FROM users WHERE id=1"); + assertThat(selectQuery.findById(Person.class, 1L)).isEqualTo("SELECT users.id, users.nick_name, users.old, users.email FROM users users WHERE users.id = 1"); + } + + @Test + void Join_조회_쿼리() { + SelectQuery selectQuery = SelectQuery.getInstance(); + System.out.println("selectQuery.bu = " + selectQuery.findById(Order.class, 1L)); + +// assertThat(selectQuery.findById(Order.class, 1L)).isEqualTo("SELECT orders.id, orders.orderNumber, order_items.id, order_items.product, order_items.quantity, order_items.order_id FROM orders orders LEFT JOIN order_items ON id = order_id WHERE orders.id = 1"); + } } diff --git a/src/test/java/sql/entity/EntityManagerImplTest.java b/src/test/java/sql/entity/EntityManagerImplTest.java index c09bcc28..fef42c3d 100644 --- a/src/test/java/sql/entity/EntityManagerImplTest.java +++ b/src/test/java/sql/entity/EntityManagerImplTest.java @@ -9,6 +9,8 @@ import persistence.sql.ddl.CreateQueryBuilder; import persistence.sql.ddl.Person; import persistence.sql.ddl.QueryBuilder; +import persistence.sql.entity.Order; +import persistence.sql.entity.OrderItem; import persistence.sql.model.EntityColumnValue; import sql.ddl.JdbcServerExtension; import sql.ddl.JdbcServerTest; @@ -30,6 +32,12 @@ class EntityManagerImplTest { static void init() { QueryBuilder createQueryBuilder = new CreateQueryBuilder(Person.class, dialect); jdbcTemplate.execute(createQueryBuilder.build()); + + QueryBuilder orderCreateQueryBuilder = new CreateQueryBuilder(Order.class, dialect); + jdbcTemplate.execute(orderCreateQueryBuilder.build()); + + QueryBuilder orderItemCreateQueryBuilder = new CreateQueryBuilder(OrderItem.class, dialect); + jdbcTemplate.execute(orderItemCreateQueryBuilder.build()); } @Test @@ -91,4 +99,24 @@ static void init() { assertThat(dirtyCheckedPerson.getEmail()).isEqualTo(updatedEmail); } + + @Test + void test() { + Order order = new Order("orderNumber"); + + OrderItem orderItem1 = new OrderItem("product", 1); + OrderItem orderItem2 = new OrderItem("product2", 1); + + order.getOrderItems().add(orderItem1); + order.getOrderItems().add(orderItem2); + + entityManager.persist(order); + + EntityPersister entityPersister = new EntityPersisterImpl(jdbcTemplate); + EntityLoader entityLoader = new EntityLoader(jdbcTemplate); + EntityManager entityManagers = new EntityManagerImpl(entityPersister, entityLoader); + + Order order1 = entityManagers.find(Order.class, 1L); + System.out.println("das"); + } } diff --git a/src/test/java/sql/model/EntityColumnNamesTest.java b/src/test/java/sql/model/EntityColumnNamesTest.java index fefc7c92..1891d12e 100644 --- a/src/test/java/sql/model/EntityColumnNamesTest.java +++ b/src/test/java/sql/model/EntityColumnNamesTest.java @@ -16,7 +16,7 @@ class EntityColumnNamesTest { EntityColumnNames entityColumnNames = new EntityColumnNames(Person.class); String columnNames = entityColumnNames.getColumnNames(); - assertThat(columnNames).isEqualTo("id, nick_name, old, email"); + assertThat(columnNames).isEqualTo("users.id, users.nick_name, users.old, users.email"); } @Test From f12dc5dbb2ea5b21e074d4efab016b48c6767cee Mon Sep 17 00:00:00 2001 From: jshans40 Date: Sat, 9 Nov 2024 11:35:02 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat=20:=20join=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EB=B0=8F=20=EC=A0=80=EC=9E=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/persistence/sql/entity/EntityRowMapper.java | 1 - src/test/java/sql/dml/SelectQueryTest.java | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/persistence/sql/entity/EntityRowMapper.java b/src/main/java/persistence/sql/entity/EntityRowMapper.java index 0d428114..d8962fa2 100644 --- a/src/main/java/persistence/sql/entity/EntityRowMapper.java +++ b/src/main/java/persistence/sql/entity/EntityRowMapper.java @@ -45,7 +45,6 @@ private void setFields(Object object, ResultSet resultSet) { private void setField(Field field, Object object, ResultSet resultSet) { try { field.setAccessible(true); - field.set(object, resultSet.getObject(new EntityColumnName(field).getValue())); } catch (IllegalAccessException e) { throw new RuntimeException(e); diff --git a/src/test/java/sql/dml/SelectQueryTest.java b/src/test/java/sql/dml/SelectQueryTest.java index ddab3af9..abdc708d 100644 --- a/src/test/java/sql/dml/SelectQueryTest.java +++ b/src/test/java/sql/dml/SelectQueryTest.java @@ -34,10 +34,7 @@ class SelectQueryTest { @Test void Join_조회_쿼리() { SelectQuery selectQuery = SelectQuery.getInstance(); - System.out.println("selectQuery.bu = " + selectQuery.findById(Order.class, 1L)); - -// assertThat(selectQuery.findById(Order.class, 1L)).isEqualTo("SELECT orders.id, orders.orderNumber, order_items.id, order_items.product, order_items.quantity, order_items.order_id FROM orders orders LEFT JOIN order_items ON id = order_id WHERE orders.id = 1"); - + assertThat(selectQuery.findById(Order.class, 1L)).isEqualTo("SELECT orders.id, orders.orderNumber, order_items.id, order_items.product, order_items.quantity, order_items.order_id FROM orders orders LEFT JOIN order_items ON orders.id = order_items.order_id WHERE orders.id = 1"); } }