Spring Data @Query использует VARCHAR вместо NVARCHAR - PullRequest
0 голосов
/ 20 апреля 2020

Код, который я разместил, не является кодом, используемым нашими компаниями, это просто пример кода, чтобы правильно проиллюстрировать проблему.

У меня есть следующий запрос данных Spring:

@Query(value = "FROM CustomerTable WHERE Name.firstName = ?1 AND Name.lastName = ?2")
List<Customer> findByName(String firstName, String lastName);

Для сущности Customer:

public class Customer {
  Name name;
  // ...
}

и Name:

public class Name {
  String firstName;
  String lastName;
  // ...
}

Это работает нормально, но данные Spring передают эти параметры как NVARCHAR вместо VARCHAR. Следовательно, БД должна выполнять дорогостоящее преобразование, которое очень дорого.

Как я могу убедиться, что Spring Data передает эти параметры как VARCHAR вместо NVARCHAR?

РЕДАКТИРОВАТЬ: я знаю, что он отправляется как NVARCHAR с помощью SQL Профилировщик. Это дает мне эту информацию:

exec sp_executesql N'select customer.id as id1_7_, ...
from customers custome0_ where custome0_.first_name=@P0 and custome0_.last_name=@P1',N'@P0 nvarchar(4000),@P1 nvarchar(4000)',N'Tom',N'Cruise'

1 Ответ

0 голосов
/ 22 апреля 2020

Мне удалось обойти дорогостоящее преобразование, изменив типы столбцов в базе данных на NVARCHAR, но затем мне также пришлось добавить аннотацию @Type к переменной экземпляра Name в моем объекте Customer:

public class Customer {
  @Type(type="org.hibernate.type.StringNVarcharType")
  Name name;
  // ...
}

Это работает, но не является предпочтительным решением, так как оно не является частью спецификации JPA.

...