Создайте запрос xPath, используя javax.persistence.criteria.CriteriaQuery в Hibernate? - PullRequest
0 голосов
/ 16 октября 2019

Я хочу получить записи из базы данных сервера MS SQL, где у меня есть столбец типа XML с именем xmlData.

Я хочу выполнить запрос с условием: /record/mark = 5 аналогично:

Query query = session.createQuery("From Test WHERE xmlData.value('(/record/mark)[1]', 'varchar(max)') like '5'");
List list = query.list();

Структура столбца xmlData:

<record>
  <name>John</name>
  <mark>5</mark>
</record>

Мой код:

        CriteriaBuilder builder = session.getCriteriaBuilder();

        CriteriaQuery<Test> criteria = builder.createQuery( Test.class );
        Root<Test> root = criteria.from( Test.class );
        criteria.select( root );
        criteria.where( builder. ); // <- how to biuld query ? 
        Test yourObject = session.createQuery( criteria ).uniqueResult();

1 Ответ

0 голосов
/ 17 октября 2019

Я не могу говорить за части Java, но могу выполнить часть sql-сервера.

SELECT * FROM Test WHERE xmlData.exist ( '/record/mark[text() = "5"]' ) = 1

Это быстрее, потому что мы выполняем все совпадения строк внутри XQuery

Но это может не подходить, поскольку оно обозначает ваши данные. Поскольку вы хотели получить значение, вы были вынуждены указать первый экземпляр [1] в своем запросе. Этот код будет соответствовать чему-то с несколькими отметками, где первая не пять, а следующая. Очевидно, что это может быть неуместным в вашем случае использования.

<record>
  <name>Louise</name>
  <mark>10</mark>
  <mark>5</mark>
</record>

Sql Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...