Ява гибернации бумага HQL запросы с nolock

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

3 ответов


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

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

который идентичен nolock.

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

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


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

  Session session = (Session) em.getDelegate();
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            }
        });

вы можете сделать "с (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();