2016-03-14 2 views
0

Позвольте мне подробно описать этот вопрос, чтобы избежать ситуации X-Y.Как установить значение поля @Transient после запроса? Использование критериев Hibernate для запроса

Я хочу использовать спящий режим, чтобы сделать LIKE запрос для получения регистров в таблице Product где Product «s User имеет свою входную строку в качестве полного имени. Что-то в SQL, как:

SELECT * FROM product WHERE id_user IN (SELECT id_user FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE ?)

Я доволен Hibernate Criteria, но в данном случае, похоже, не имеет никакого способа сделать объединение столбцов значений поиска в Criteria (я не хочу, чтобы произвести некоторые пользовательские критерии, в сторону), так что я пытаюсь использовать Restriction.sqlRestriction(), но я обнаружил, что в некоторых случаях createAlia() довольно легко, а sqlRestriction невозможно, например, как:

criteria.createAlias("user.supervisor.teamleader", "uT"); 

Итак, я рассматриваю другое решение: создание @Transient поле User, чтобы сохранить полное имя, объединив first_name, " " и last_name, потому что теперь в базе данных нет столбца с именем full_name, и я не хочу прикасаться к структуре таблицы, которая требует изменения в производственной базе данных.

Если я объявляю full_name поля в конструкторе по умолчанию User класса, когда я получить некоторые User объект из базы данных, это будет поле содержит first_name + " " + last_name как я ожидаю, или это будет null?

ответ

0

Если я объявляю поле full_name в конструкторе по умолчанию класса User, когда я получаю какой-либо пользовательский объект из базы данных, будет ли это поле содержать имя_имя + "" + last_name, как я ожидаю, или оно будет null?

Он будет содержать строку "null null", поскольку конструктор по умолчанию вызывается перед популяцией полей.

Сущность - это простой класс Java. Поэтому конструктор по умолчанию всегда вызывается, в первую очередь, если вы делаете new Persist() или Class<Persist>.newInstance(). Второй способ - как Hibernate создает объекты постоянных классов.

И этот подход не будет решать ваши задачи, из-за

CONCAT(first_name, ' ', last_name) LIKE ? 

не то же самое

first_name LIKE ? or last_name LIKE ? 

Я не хочу, чтобы произвести некоторые пользовательские критерии, помимо

Я бы посоветовал вам это сделать. Я написал такое ограничение какое-то время, прежде чем

How can I concatenate two properties into one property using hibernate criteria query

Вы можете попробовать использовать @Formula тоже, как описано в ссылке выше.

+0

О первом моменте, спасибо, потому что я точно не знаю порядок строительства сущности и ее населения.Что касается второго момента, мой вопрос четко определен, потому что пользователь может ввести «Джон», «Белый» или «Джон Уайт», а «Джон» - как имя, а «Белый» - как фамилия. И третий момент, к моему удивлению, я просто нашел тот же пост после того, как задал этот вопрос ... Иногда я не знаю точного термина, такого как «производное свойство» в этом случае .... Thx. Примите ваш ответ. – FaithReaper

+0

@FaithReaper Добро пожаловать. Я обновляю свой ответ. –

Смежные вопросы