Java Hibernate HQL-запросы с nolock - PullRequest
       26

Java Hibernate HQL-запросы с nolock

10 голосов
/ 17 августа 2010

Есть ли способ выполнить эти запросы, как если бы я добавил к ним подсказку (NOLOCK)?

Ответы [ 3 ]

8 голосов
/ 17 августа 2010

Если вам это действительно нужно, то вы хотите сделать что-то вроде:

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

, идентичное нолоку.

Прежде чем сделать это, подумайте внимательно, если хотитеделать грязное чтение.В большинстве случаев люди делают это, потому что это то, что они всегда делали, а не потому, что это правильно.В частности, это плохо работает с кэшированием.

На самом деле, этот поток немного затрагивает вопросы.Внимательно прочитайте, прежде чем принять решение.

7 голосов
/ 21 января 2014

В последней версии Hibernate вы должны сделать это следующим образом:

  Session session = (Session) em.getDelegate();
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            }
        });
2 голосов
/ 22 октября 2015

Вы можете сделать «с (nolock)», если вы идете родной.Это экстремально, но если альтернативой является изменение уровня изоляции транзакции, вы можете сделать это.

Обратите внимание, что этот пример предназначен для MSSQL.

String sqlQueryString = "SELECT * FROM my_classes_table WITH (nolock) WHERE columnName = :columnValue";

SQLQuery sqlQuery= session.createSQLQuery(sqlQueryString).addEntity(MyClass.class);
sqlQuery.setLong("columnValue", value);
List<MyClass> out = sqlQuery.list();
...