Skip to content

Commit

Permalink
Do not convert binary data in byte[].
Browse files Browse the repository at this point in the history
Closes #1900
  • Loading branch information
schauder committed Oct 2, 2024
1 parent 9be01a3 commit 5266155
Show file tree
Hide file tree
Showing 11 changed files with 78 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
public StringBasedJdbcQuery(JdbcQueryMethod queryMethod, NamedParameterJdbcOperations operations,
@Nullable RowMapper<?> defaultRowMapper, JdbcConverter converter,
QueryMethodEvaluationContextProvider evaluationContextProvider) {
this(queryMethod.getRequiredQuery(), queryMethod, operations, result -> (RowMapper<Object>) defaultRowMapper, converter, evaluationContextProvider);
this(queryMethod.getRequiredQuery(), queryMethod, operations, result -> (RowMapper<Object>) defaultRowMapper,
converter, evaluationContextProvider);
}

/**
Expand Down Expand Up @@ -244,7 +245,7 @@ private JdbcValue writeValue(@Nullable Object value, TypeInformation<?> typeInfo
TypeInformation<?> actualType = typeInformation.getActualType();

// tuple-binding
if (actualType != null && actualType.getType().isArray()) {
if (actualType != null && actualType.getType().isArray() && !actualType.getType().equals(byte[].class)) {

TypeInformation<?> nestedElementType = actualType.getRequiredActualType();
return writeCollection(collection, parameter.getActualSqlType(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.ApplicationListener;
Expand All @@ -51,23 +50,13 @@
import org.springframework.core.io.ClassPathResource;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Limit;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.ScrollPosition;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Window;
import org.springframework.data.domain.*;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactory;
import org.springframework.data.jdbc.testing.ConditionalOnDatabase;
import org.springframework.data.jdbc.testing.DatabaseType;
import org.springframework.data.jdbc.testing.EnabledOnDatabase;
import org.springframework.data.jdbc.testing.EnabledOnFeature;
import org.springframework.data.jdbc.testing.IntegrationTest;
import org.springframework.data.jdbc.testing.TestConfiguration;
Expand Down Expand Up @@ -126,7 +115,6 @@ private static DummyEntity createDummyEntity(String entityName) {

DummyEntity entity = new DummyEntity();
entity.setName(entityName);

return entity;
}

Expand Down Expand Up @@ -1357,6 +1345,52 @@ void queryWithTupleIn() {
assertThat(result).containsOnly(two);
}

@Test // GH-1900
void queryByListOfByteArray() {

byte[] oneBytes = { 1, 2, 3, 4, 5, 6, 7, 8 };
DummyEntity one = createDummyEntity("one");
one.setBytes(oneBytes);
one = repository.save(one);

byte[] twoBytes = { 8, 7, 6, 5, 4, 3, 2, 1 };
DummyEntity two = createDummyEntity("two");
two.setBytes(twoBytes);
two = repository.save(two);

byte[] threeBytes = { 3, 3, 3, 3, 3, 3, 3, 3 };
DummyEntity three = createDummyEntity("three");
three.setBytes(threeBytes);
three = repository.save(three);

List<DummyEntity> result = repository.findByBytesIn(List.of(threeBytes, oneBytes));

assertThat(result).extracting("idProp").containsExactlyInAnyOrder(one.idProp, three.idProp);
}

@Test // GH-1900
void queryByByteArray() {

byte[] oneBytes = { 1, 2, 3, 4, 5, 6, 7, 8 };
DummyEntity one = createDummyEntity("one");
one.setBytes(oneBytes);
one = repository.save(one);

byte[] twoBytes = { 8, 7, 6, 5, 4, 3, 2, 1 };
DummyEntity two = createDummyEntity("two");
two.setBytes(twoBytes);
two = repository.save(two);

byte[] threeBytes = { 3, 3, 3, 3, 3, 3, 3, 3 };
DummyEntity three = createDummyEntity("three");
three.setBytes(threeBytes);
three = repository.save(three);

List<DummyEntity> result = repository.findByBytes(twoBytes);

assertThat(result).extracting("idProp").containsExactly(two.idProp);
}

private Root createRoot(String namePrefix) {

return new Root(null, namePrefix,
Expand Down Expand Up @@ -1487,6 +1521,12 @@ interface DummyEntityRepository extends CrudRepository<DummyEntity, Long>, Query

@Query("SELECT * FROM DUMMY_ENTITY WHERE (ID_PROP, NAME) IN (:tuples)")
List<DummyEntity> findByListInTuple(List<Object[]> tuples);

@Query("SELECT * FROM DUMMY_ENTITY WHERE BYTES IN (:bytes)")
List<DummyEntity> findByBytesIn(List<byte[]> bytes);

@Query("SELECT * FROM DUMMY_ENTITY WHERE BYTES = :bytes")
List<DummyEntity> findByBytes(byte[] bytes);
}

interface RootRepository extends ListCrudRepository<Root, Long> {
Expand Down Expand Up @@ -1810,6 +1850,7 @@ static class DummyEntity {
boolean flag;
AggregateReference<DummyEntity, Long> ref;
Direction direction;
byte[] bytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };

public DummyEntity(String name) {
this.name = name;
Expand Down Expand Up @@ -1890,6 +1931,10 @@ public int hashCode() {
return Objects.hash(name, pointInTime, offsetDateTime, idProp, flag, ref, direction);
}

public void setBytes(byte[] bytes) {
this.bytes = bytes;
}

@Override
public String toString() {
return "DummyEntity{" + "name='" + name + '\'' + ", idProp=" + idProp + '}';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public MsSqlDataSourceConfiguration(TestClass testClass, Environment environment
protected DataSource createDataSource() {

if (MSSQL_CONTAINER == null) {

System.out.println("------------------- creation Microsoft SQL Server container -----------------------------------");
MSSQLServerContainer<?> container = new MSSQLServerContainer<>(MS_SQL_SERVER_VERSION) //
.withReuse(true);
container.start();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME TIMESTAMP, -- with time zone is only supported with z/OS
FLAG BOOLEAN,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME TIMESTAMP WITH TIME ZONE,
FLAG BOOLEAN,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME TIMESTAMP WITH TIME ZONE,
FLAG BOOLEAN,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME TIMESTAMP(3),
FLAG BOOLEAN,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME DATETIMEOFFSET,
FLAG BIT,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES VARBINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ CREATE TABLE DUMMY_ENTITY
OFFSET_DATE_TIME TIMESTAMP(3) DEFAULT NULL,
FLAG BIT(1),
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BINARY(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ CREATE TABLE DUMMY_ENTITY
OFFSET_DATE_TIME TIMESTAMP WITH TIME ZONE,
FLAG NUMBER(1,0),
REF NUMBER,
DIRECTION VARCHAR2(100)
DIRECTION VARCHAR2(100),
BYTES RAW(8)
);

CREATE TABLE ROOT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ CREATE TABLE dummy_entity
OFFSET_DATE_TIME TIMESTAMP WITH TIME ZONE,
FLAG BOOLEAN,
REF BIGINT,
DIRECTION VARCHAR(100)
DIRECTION VARCHAR(100),
BYTES BYTEA
);

CREATE TABLE ROOT
Expand Down

0 comments on commit 5266155

Please # to comment.