Подтвердить что ты не робот

Объект JPA без базовой таблицы

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

Это мой класс, для которого я хочу, чтобы результат отображался.

import java.math.BigDecimal;
import javax.persistence.Entity;
@Entity
public class OpUsage {  
    String username;    
    BigDecimal number_of_clicks;    
    String accordion;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public BigDecimal getNumber_of_clicks() {
        return number_of_clicks;
    }
    public void setNumber_of_clicks(BigDecimal number_of_clicks) {
        this.number_of_clicks = number_of_clicks;
    }

    public String getAccordion() {
        return accordion;
    }

    public void setAccordion(String accordion) {
        this.accordion = accordion;
    }
}
4b9b3361

Ответ 1

Спецификация JPA 2.1 определяет средства для возврата результата из собственного запроса в класс non entity

Вы должны проверить заголовок 3.10.16.2 Возврат неуправляемых экземпляров, особенно

3.10.16.2.2 Результаты конструктора

Отображение конструкторам задается с помощью ConstructorResult аннотации аннотации SqlResultSetMapping. Элемент targetClass аннотации ConstructorResult указывает класс, конструктор которого соответствует указанным столбцам. Все столбцы, соответствующие аргументам предполагаемого конструктора, должны быть заданный с помощью элемента столбцов ConstructorResult аннотации в том же порядке, что и список аргументов конструктор. Любые объекты, возвращаемые в качестве результатов конструктора, будут либо нового, либо отсоединенного состояния, в зависимости от того, ключ извлекается для построенного объекта.

Пример

Query q = em.createNativeQuery(
        "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS
        avgOrder" +
        "FROM Customer c, Orders o " +
                "WHERE o.cid = c.id " +
                "GROUP BY c.id, c.name",
        "CustomerDetailsResult");

@SqlResultSetMapping(name = "CustomerDetailsResult",
        classes = {
                @ConstructorResult(targetClass = com.acme.CustomerDetails.class,
                        columns = {
                                @ColumnResult(name = "id"),
                                @ColumnResult(name = "name"),
                                @ColumnResult(name = "orderCount"),
                                @ColumnResult(name = "avgOrder", type = Double.class)})
        })