Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate маппинг полей / 25 сообщений из 33, страница 1 из 2
10.11.2018, 11:07
    #39730988
Timein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
Добрый день.
С 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
10.11.2018, 12:00
    #39730997
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
TimeinПотребовалось ввести новое поле - адрес.
На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц?
...
Рейтинг: 0 / 0
10.11.2018, 12:20
    #39731001
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
А ты само поле в таблицу то добавил?
...
Рейтинг: 0 / 0
10.11.2018, 12:27
    #39731005
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
У тебя запрос хибер строит перечисляя все поля, что в сущности. А скл тупо ошибку даёт что такого поля нет. Потому что по ходу его действительно нет. Как правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь, лмбоо сам хибер если хбм2ддл у тебя стоит в режиме криейт (правда, тогда он будет у тебя базу дропать :))
...
Рейтинг: 0 / 0
10.11.2018, 12:30
    #39731008
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
andreykaTА ты само поле в таблицу то добавил?непонятно какое поле. Если один адрес то это string. Если много, то это id.
...
Рейтинг: 0 / 0
10.11.2018, 12:32
    #39731010
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
andreykaTКак правило, это делает либо какая нибудь миграционная фигня где ты руками это все прописываешь,разумеется перед правкой кода поле в бд должно быть.
Только из за этого вся фигня что ли?
...
Рейтинг: 0 / 0
10.11.2018, 12:41
    #39731014
Timein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
Petro123TimeinПотребовалось ввести новое поле - адрес.
На эту сущность завязано довольно много запросов. Например, такого типа:где сущность Адрес и маппинг один ко многим двух таблиц?
Это не сущность.
Я, скорее всего, неправильно выразился.
Как таковой таблицы User в базе нет. Есть процедура search.search_user, которая джойнит несколько таблиц и возвращает результат, который уже потом маппится на сущность User (с аннотацией @Entity, кстати, мог промахнуться. Код сейчас воспроизводил по памяти, под рукой нет)
Соответственно, search.search_user - это старая процедура, которая знать ничего не знает про поле address и возвращает ровно два значения (имя и фамилию). Вот тут и возникает проблема.

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

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

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


ну да.
Гугл весь пестрит мессагами что звёздочка - зло.
...
Рейтинг: 0 / 0
10.11.2018, 13:57
    #39731043
Timein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
Petro123, к сожалению, так тоже не работает. При таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию
...
Рейтинг: 0 / 0
10.11.2018, 14:07
    #39731048
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
TimeinПри таком запросе hibernate все равно просит address, даже если ему указывать, что он должен возвращать только имя и фамилию
не верю.
1. Запусти это не в Java, а в СУБД при добавленном новом поле в ХП
select name, lastname from table(search.search_user(p_name=>:p_name))
Работает?
Тогда
2.
БЕЗ добавки в класс поля проверить что работает в Java.
Работает?
Тогда
3.
Только в нужном месте сделать class UserAndAdress с допПолем
...
Рейтинг: 0 / 0
10.11.2018, 14:34
    #39731055
Timein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
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
10.11.2018, 14:39
    #39731056
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
TimeinЕще раз обозначу, что я пытаюсь добиться: добавить в класс User новое поле + не менять старые запросы (максимум, заменить * на поля)
либо другой класс, либо ищи где звезда или старый класс без поля. Чудес не бывает.
...
Рейтинг: 0 / 0
10.11.2018, 15:54
    #39731075
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
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
10.11.2018, 18:31
    #39731113
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate маппинг полей
вы че стебетесь чтоле все? ТС добавь поле lastName в свою таблицу наконец. скажем так: alter table "user" add column lastName varchar(255) ну или типа того че там сто лет скулем не пользовался.

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

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

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

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


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