JPA: есть ли способ запустить простой оператор SELECT, который обращается только к нескольким столбцам? - PullRequest
1 голос
/ 07 декабря 2011

Я новичок в JPA, так что прости меня, если мой вопрос кажется глупым.

Мы использовали JPA в нашем проекте.Я вижу, что каждый объект сущности имеет прямое сопоставление с таблицей, и каждая строка в таблице является объектом этого типа сущности.

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

Есть две таблицы.В первой таблице все настроено с помощью JPA, так что каждая строка может быть преобразована в тип объекта.В первой таблице есть столбец, на который есть ссылки во второй таблице, например, в таблице A есть столбец CLOTH_ID, а в таблице B есть столбцы CLOTH_ID и CLOTH_DESCRIPTION.CLOTH_ID используется в таблицах A и B;Но B имеет столбцы CLOTH_DESCRIPTION, что соответствует CLOTH_ID.

Я отображаю таблицу A на своей веб-странице, но мне также нужно отобразить: CLOTH_DESCRIPTION на моей веб-странице.Есть JPA-ориентированный способ сделать это или лучше использовать обычный JDBC для извлечения значений CLOTH DESCRIPTION?

1 Ответ

4 голосов
/ 07 декабря 2011

Я полагаю, у вас есть следующие настройки:

@Entity
@Table(name="A")
class A {

    @ManyToOne
    @JoinColumn(name="CLOTH_ID")
    private B cloth;

    //...

}

@Entity
@Table(name="B")
class B {
    @Id
    @Column(name="CLOTH_ID")
    private int id;

    @Column(name="CLOTH_DESCRIPTION")
    private String description;

    //...
}

Если вы не ... вы делаете это неправильно (т.е. это не идиоматическое использование JPA). У вас есть следующие варианты:

Просто получить A

В этом случае @ManyToOne связь будет по умолчанию также выбрана. Тогда просто позвоните в Java:

a.getCloth().getDescription()

Предпочитаю этот подход, так как он самый простой и самый идиоматический, если только число столбцов в B не равно огромно .

Использовать запрос JPA с пользовательскими столбцами:

SELECT a, a.b.description
FROM A a
WHERE a.id = :id

В этом случае запрос возвращает List<Object[]>, где Object[] фактически содержит два элемента: A и String.

То же, что и выше, но с пользовательским DTO:

class Adto {

    private final A a;
    private final String description;

    public Adto(A a, String description) {
        this.a = a;
        this.description = description;
    }

}

И немного измененный запрос:

SELECT new Adto(a, a.b.description)
FROM A a
WHERE a.id = :id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...