пытаясь запустить именованный запрос - PullRequest
2 голосов
/ 16 марта 2010

Я делаю следующее:

@Entity
@SqlResultSetMapping(name="getxxxx",
        entities=@EntityResult(xxxx.class,
            fields = {
                    @FieldResult(name="x1", column = "x1"),
                    @FieldResult(name="x2", column = "x2")}))

@NamedNativeQuery(name=" getxxxx ",
    query="select x1, x2 from yyyy", 
    resultSetMapping=" getxxxx ")

} )public class xxxx{

    .
    .
    .
    public xxxx() {

}

я получаю ошибку: «Таблица« xxxx »не может быть разрешена», класс xxxx не является таблицей, сопоставленной с моим источником, Я пытаюсь сделать запрос в БД и вернуть результаты в мой класс это возможно?

Ответы [ 3 ]

0 голосов
/ 21 апреля 2010

Звучит так, как будто xxxx не должно быть бином сущности, поскольку JPA недовольна возвращением результатов в бинах не сущности. Вместо этого вы должны вызвать createNativeQuery только с строкой SQL. Затем вызовите query.getResultList () , чтобы получить результат в виде List (Object []) и использовать его для заполнения вашего бина результата, не являющегося объектом.

Несколько лет назад я написал сообщение в блоге , которое может помочь вам выполнять сложные нативные запросы с помощью JPA.

0 голосов
/ 16 мая 2010

Да, это возможно, но немного сложно.Вот сложный пример, который должен охватывать большинство основ.В этом примере:

  • У вас есть объект СЧЕТА с датой платежа;
  • Каждый СЧЕТ имеет отношение много к одному с КОМПАНИЕЙ;INVOICE также имеет отношение ноль или один ко многим с набором ITEMS

Вот схема:

CREATE TABLE "public"."invoice" (
  id SERIAL, 
  company_id int, 
  due_date date, 
  PRIMARY KEY(id)
);
CREATE TABLE "public"."item" (
  id SERIAL, 
  invoice_id int,
  description text,
  PRIMARY KEY(id)
);
CREATE TABLE "public"."company" (
  id SERIAL,
  name text,
  PRIMARY KEY(id)
);

Объект INVOICE (невероятно запутанный примердля полноты):

@Entity
@Table(name = "invoice")
@Loader(namedQuery = "loadInvoiceObject")
@NamedNativeQuery(name="loadInvoiceObject",
  query="SELECT " +
        "inv.id," +
        "inv.due_date," +
        "co.*," +
        "it.*," +
        "FROM invoice inv " +
        "JOIN company co ON co.id = inv.company_id " +
        "LEFT OUTER JOIN item it ON it.invoice_id = inv.id " +
        "WHERE inv.id = :id",
  resultSetMapping = "invoicemap")
@SqlResultSetMapping(name = "invoicemap",
  entities = {
    @EntityResult(entityClass = Invoice.class),
    @EntityResult(entityClass = Company.class),
    @EntityResult(entityClass = Item.class)
  }
)
public class Invoice {

  private Integer id;
  private Date dueDate;
  private Company company;
  private List<Item> items = new ArrayList<Item>();

  public Invoice() { /* no-args constructor */ }

  @Id
  @Column(name = "id", nullable = false)
  public Integer getId() { return id; }
  public void setId(Integer id) { this.id = id; }

  @Column(name = "due_date")
  @Temporal(TemporalType.DATE)
  public Date getDueDate() { return dueDate; }
  public void setDueDate(Date dueDate) { this.dueDate = dueDate; }

  @ManyToOne(optional = false)
  @JoinColumn(name = "company_id", nullable = false)
  public Company getCompany() { return company; }
  public void setCompany(Company company) { this.company = company; }

  @OneToMany(mappedBy = "invoice")
  public List<Item> getItems() { return items; }
  public void setItems(List<Item> items) { this.items = items; }

}

Объект ITEM:

@Entity
@Table(name = "item")
public class Item {

  private Integer id;
  private String description;
  private Invoice invoice;

  public Item() { /* no-args constructor */ }

  @Id
  @Column(name = "id", nullable = false)
  public Integer getId() { return id; }
  public void setId(Integer id) { this.id = id; }

  @Column(name = "description")
  public String getDescription() { return description; }
  public void setDescription(String description) { this.description = description; }

  @ManyToOne(optional = false)
  @JoinColumn(name = "invoice_id", nullable = false)
  public Invoice getInvoice() { return invoice; }
  public void setInvoice(Invoice invoice) { this.invoice = invoice; }

}

Объект COMPANY:

@Entity
@Table(name = "company")
public class Company {

  private Integer id;
  private String name;
  private List<Invoice> invoices = new ArrayList<Invoice>();

  public Company() { /* no-args constructor */ }

  @Id
  @Column(name = "id", nullable = false)
  public Integer getId() { return id; }
  public void setId(Integer id) { this.id = id; }

  @Column(name = "name")
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }

  @OneToMany(mappedBy = "company")
  public List<Invoice> getInvoices() { return invoices; }
  public void setInvoices(List<Invoice> invoices) { this.invoices = invoices; }

}
0 голосов
/ 22 марта 2010

В этой ситуации первым делом я бы попытался удалить аннотацию @Entity. А затем измените либо имя класса, либо собственное имя запроса, чтобы один из них был «xxxx», а другой - «zzzz», чтобы я был уверен, что знаю, на что жаловалась среда выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...