Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate не ставить символ N перед строками / 3 сообщений из 3, страница 1 из 1
19.03.2007, 16:50:25
    #34400831
Zealander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить Hibernate не ставить символ N перед строками
Всем привет!

Есть проблема. При формировании запросов hibernate к базе данных MS SQL Server'a перед каждой строкой hibernate подставляет N' (для преобразования строки в юникодовую строку). Проблема в том, что MS SQL Server' неоптимально составляет план выполнения запроса, если разные типы данных в запросе и конечной таблице (в таблице они как однобайтовые строки).

DDL таблицы:
CREATE TABLE [ENTITY] (
[ENTT_ID] varchar(32) NOT NULL,
[ENTT_URLPART] varchar(32) NULL,
[ENTT_NAME] varchar(64) NULL,
[ENTT_ISVIEWABLE] smallint NULL,
[ENTT_SITE] varchar(32) NULL,
[SITE_ID] int NULL,
[ENTT_ICON] varchar(256) NULL,
CONSTRAINT [PK_ENTITY] PRIMARY KEY([ENTT_ID])
)

Обьявление класса:
public class Entity implements Serializable {

...
private String id;
private String urlPart;
private String name;
private Boolean isViewable;
private Site site;
private String icon;
...
}

Сделал mapping для класса:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.persistence.pojo">
<class name="Entity" table="Entity" mutable="false" lazy="true">
<id name="id" column="entt_id"></id>
<property name="name" column="entt_name" />
<property name="urlPart" column="entt_urlPart" />
<property name="isViewable" column="entt_isViewable" />
<property name="icon" column="entt_icon" />
<many-to-one name="site" column="site_id" class="Site"
lazy="false" />
</class>
</hibernate-mapping>


hibernate генерирует следующий запрос к БД MS SQL:

... and entity1_.entt_id in (N'news',N'news_analytics',N'news_comment',N'news_interview',N'news_photo',N'news_pr',N'news_press') ...

Запрос выполняется очень долго. Если убрать N перед каждой строкой, запрос выполняется на несколько порядков быстрее, так как строится совершенно другой (уже оптимальный) план запроса.

Вопрос : Как можно заставить hibernate не подставлять префикс N перед каждой строкой? Как можно решить мою проблему?

Заранее благодарен за любую помощь
...
Рейтинг: 0 / 0
19.03.2007, 18:28:52
    #34401091
BlackWall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить Hibernate не ставить символ N перед строками
возможно, дело в парамтерах не/передаваемых JDBC драйверу
...
Рейтинг: 0 / 0
20.03.2007, 09:42:23
    #34401851
Oleg Belkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить Hibernate не ставить символ N перед строками
У нас была обратная проблема - как заставить Hibernate передавать unicode строки, вместо Ansi.

В нашем случае все решилось сменой dialect-a (отнаследовали наш dialect от родительского и переопределили значения для string). В Вашем случае задача, похоже обратная.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  SQLServer2000UnicodeDialect  extends  SQLServerDialect {

     public  SQLServer2000UnicodeDialect ()
    {
         super ();
       
        // Use Unicode Characters
        registerColumnType( Types.VARCHAR, "nvarchar($l)" );
        registerColumnType( Types. CHAR , "nchar(1)" );
        registerColumnType( Types.CLOB, "ntext" );
       
        // Microsoft SQL Server 2000 supports bigint and bit
        registerColumnType( Types.BIGINT, "bigint" );
        registerColumnType( Types.BIT, "bit" );

    }
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заставить Hibernate не ставить символ N перед строками / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]