powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг полей
25 сообщений из 33, страница 1 из 2
hibernate маппинг полей
    #39730988
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
С hibernate только разбираюсь, но остался в наследство довольно большой код, и потребовалось внести в него изменения.
Есть сущность User
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Entity
public class User {
    private String name;
    private String lastName;
    private String address;

//getters, setters
}


Изначально в нем было только 2 поля - имя и фамилия. Потребовалось ввести новое поле - адрес.
На эту сущность завязано довольно много запросов. Например, такого типа:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    
@Override
    public List<User> getUsers(String name) {

        List<User> users = Collections.emptyList();
        try {
            Query usersQuery = entityManager.createNamedQuery("User.findAllUserByName");
            usersQuery.setParameter("p_name", name);
            usersQuery.setMaxResults(50);

            users = usersQuery.getResultList();
        } catch (Exception e) {
            //обработка ошибок
        }
        return users;
    }



Код: plsql
1.
2.
3.
<named-native-query name="User.findAllUserByName" result-class="com.example.entity.User">
    <query>select*from table(search.search_user(p_name=>:p_name))</query>
</named-native-query>


Этот запрос возвращает только имя и фамилию.

Раньше все работало, но стоит добавить то самое поле address в User, как программа падает на строке users = usersQuery.getResultList(); с ошибкой invalid column name
Можно ли как-то обозначить для хибернейта, что если в запросе нет результата для этого поля, то его не надо заполнять?
Или есть какие-то другие обходные пути?
К сожалению, User используется много где, и обойти все запросы и добавлять туда новое поле - довольно сложно
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39730997
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinПотребовалось ввести новое поле - адрес.
На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц?
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731001
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты само поле в таблицу то добавил?
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731005
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя запрос хибер строит перечисляя все поля, что в сущности. А скл тупо ошибку даёт что такого поля нет. Потому что по ходу его действительно нет. Как правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь, лмбоо сам хибер если хбм2ддл у тебя стоит в режиме криейт (правда, тогда он будет у тебя базу дропать :))
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731008
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTА ты само поле в таблицу то добавил?непонятно какое поле. Если один адрес то это string. Если много, то это id.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731010
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTКак правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь,разумеется перед правкой кода поле в бд должно быть.
Только из за этого вся фигня что ли?
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731014
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123TimeinПотребовалось ввести новое поле - адрес.
На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц?
Это не сущность.
Я, скорее всего, неправильно выразился.
Как таковой таблицы User в базе нет. Есть процедура search.search_user, которая джойнит несколько таблиц и возвращает результат, который уже потом маппится на сущность User (с аннотацией @Entity, кстати, мог промахнуться. Код сейчас воспроизводил по памяти, под рукой нет)
Соответственно, search.search_user - это старая процедура, которая знать ничего не знает про поле address и возвращает ровно два значения (имя и фамилию). Вот тут и возникает проблема.

Проблема в том, что поле adress надо добавить для другого запроса. Но как только я добавляю address в класс, я ломаю весь старый код, который когда-то получал заполненный User из базы
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731017
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinЭто не сущность.
Я, скорее всего, неправильно выразился.
Как таковой таблицы User в базе нет. Есть процедура search.search_user, которая джойнит несколько таблиц и возвращает результат, который уже потом маппится на сущность User (с аннотацией @Entity, кстати, мог промахнуться. Код сейчас воспроизводил по памяти, под рукой нет)
Круто ты. Сущность, не сущность. У сущности таблицы нет.
Разбирайся там, т.к. Хибер так не работает... Если его не ставить раком.
Название темы означает показ Сущности и маппинга РЕАЛЬНОГО.
А также бд РЕАЛЬНОЙ.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731018
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увидел что из хранимки))
andreykaT тогда прав. Смотри наличие поля.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731019
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinСоответственно, search.search_user - это старая процедура, которая знать ничего не знает про поле address и возвращает ровно два значения (имя и фамилию). Вот тут и возникает проблема.хранимка?
Добавить туда поле, либо рядом другую либо join уже в java.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731020
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timeinломаю весь старый кодникогда не используй звездочки select *
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731025
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123хранимка?
Добавить туда поле, либо рядом другую либо join уже в java.
Добавить конкретно сюда - не проблема. Но я уже писал выше, что таких запросов много. И перерывать весь код, а так же добавлять по сути пустое значение (в тех местах адрес не нужен), несколько проблематично. Потому и спросил, нет ли какого-то более простого решения.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731029
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timein,
Если бы говнокодеры не ставили раньше звезд проблема решена?
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731036
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Timein,
Если бы говнокодеры не ставили раньше звезд проблема решена?

Честно говоря, не очень вас понял.
Вы имеете в виду, что если бы изначально запрос был написан так?
Код: plsql
1.
select name, lastname from table(search.search_user(p_name=>:p_name))
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731040
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinPetro123Timein,
Если бы говнокодеры не ставили раньше звезд проблема решена?

Честно говоря, не очень вас понял.
Вы имеете в виду, что если бы изначально запрос был написан так?
Код: plsql
1.
select name, lastname from table(search.search_user(p_name=>:p_name))


ну да.
Гугл весь пестрит мессагами что звёздочка - зло.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731043
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, к сожалению, так тоже не работает. При таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731048
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinПри таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию
не верю.
1. Запусти это не в Java, а в СУБД при добавленном новом поле в ХП
select name, lastname from table(search.search_user(p_name=>:p_name))
Работает?
Тогда
2.
БЕЗ добавки в класс поля проверить что работает в Java.
Работает?
Тогда
3.
Только в нужном месте сделать class UserAndAdress с допПолем
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731055
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Еще раз обозначу, что я пытаюсь добиться: добавить в класс User новое поле + не менять старые запросы (максимум, заменить * на поля)

Сейчас поднял старый какой-то проект, попытался на нем.
Вместо хранимой процедуры использовал существующую в базе таблицу в которой поля адрес нет

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
@Entity
@NamedNativeQuery(
                name = "User.findAllUser",
                query = "SELECT user_Id, name, lastName FROM sameTable",
        resultClass = User.class
)
public class User {
    private long userId;
    private String name;
    private String lastName;

    private String address;


    @Id
    @Column(name = "USER_ID")
    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}



Код: java
1.
2.
3.
            
            Query usersQuery = entityManager.createNamedQuery("User.findAllUser");
            List<User> user = usersQuery.getResultList();



Соответственно, без address все работает, с address

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.dialect.SQLiteSQLExceptionConversionDelegate.convert(SQLiteSQLExceptionConversionDelegate.java:48)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.loader.Loader.doList(Loader.java:2557)
at org.hibernate.loader.Loader.doList(Loader.java:2540)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
at org.hibernate.loader.Loader.list(Loader.java:2365)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1909)
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
... 1 more
Caused by: java.sql.SQLException: no such column: 'address'

Похоже, отделаться малой кровью не удастся и действительно придется создавать отдельный класс, с разницей в одно поле
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731056
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeinЕще раз обозначу, что я пытаюсь добиться: добавить в класс User новое поле + не менять старые запросы (максимум, заменить * на поля)
либо другой класс, либо ищи где звезда или старый класс без поля. Чудес не бывает.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731075
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timein[src java]
@Entity
@NamedNativeQuery(
name = "User.findAllUser",
query = "SELECT user_Id, name, lastName FROM sameTable",
resultClass = User.class
)
Это же не SQL нифига, а JPQL, соответственно если выбираете "сущность", то там все поля должны быть, или выбирайте что-то другое, Tuple или Object[]
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731113
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы че стебетесь чтоле все? ТС добавь поле lastName в свою таблицу наконец. скажем так: alter table "user" add column lastName varchar(255) ну или типа того че там сто лет скулем не пользовался.

еще раз. хибер делает запрос где перечисляет все поля (все три поля в твоем случае) и конечно же скуэл его обламывает потому что поля нет. даже если ТЫ не делаешь такого запроса - это не значит что хибер его не делает где-нибудь без тебя.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731164
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
да он не слышит ни тебя и меня.
Я ему п.п. 1, а он ноль реакции
автор1. Запусти это не в Java, а в СУБД при добавленном новом поле в ХП
select name, lastname from table(search.search_user(p_name=>:p_name))
Работает?
авторЕще раз обозначу, что я пытаюсь добиться:
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731194
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а... ну тогда окей
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731197
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreykaTвы че стебетесь чтоле все? ТС добавь поле lastName в свою таблицу наконец. скажем так: alter table "user" add column lastName varchar(255) ну или типа того че там сто лет скулем не пользовался.

еще раз. хибер делает запрос где перечисляет все поля (все три поля в твоем случае) и конечно же скуэл его обламывает потому что поля нет. даже если ТЫ не делаешь такого запроса - это не значит что хибер его не делает где-нибудь без тебя.

Я вот тоже, честно говоря, не знаю, чем вы читаете. Нет никакой таблицы. Есть процедура, которая возвращает значения. И я, по-моему, и уже писал, что мне не проблема в нее добавить вывод этого поля. НО! Есть куча nativeQuery, которые использует класс без нового поля и этот код падает с классом с новым полем. Ровно потому что хибернейт ждет и там это поле.

В этом и состоял вопрос можно ли обойти исправление всего sqlного кода, если добавить новое поле.
А вы мне упорно твердите: добавь новое поле.
...
Рейтинг: 0 / 0
hibernate маппинг полей
    #39731204
Timein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И на данный момент уже же написали, что надо добавлять новый класс или использовать Tuple или Object[]
За эти ответы я благодарен, хотя в текущем коде эти методы скорее будут костылями
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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