Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在尝试运行命名查询_Java_Jpa - Fatal编程技术网

Java 正在尝试运行命名查询

Java 正在尝试运行命名查询,java,jpa,Java,Jpa,我正在做以下工作: @Entity @SqlResultSetMapping(name="getxxxx", entities=@EntityResult(xxxx.class, fields = { @FieldResult(name="x1", column = "x1"), @FieldResult(name="x2", column = "x2")})) @Named

我正在做以下工作:

@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不是映射到我的源中的表, 我试图查询数据库并将结果返回到我的类中
有可能吗?

在这种情况下,我要做的第一件事就是删除@Entity注释。然后更改类名或本机查询名,其中一个是xxxx,另一个是zzzz,这样我就知道运行时在抱怨什么了。

在这种情况下,我要做的第一件事就是删除@Entity注释。然后更改类名或本机查询名,其中一个是xxxx,另一个是zzzz,这样我就知道运行时在抱怨什么了。

听起来xxxx不应该是实体bean,因为JPA不喜欢在非实体bean中返回结果。您必须只使用SQL字符串调用createNativeQuery。然后调用query.getResultList将结果作为ListObject[]获取,并使用它填充非实体结果bean

几年前,我写了一篇文章,这可能会帮助您使用JPA执行高级本机查询。

听起来xxxx不应该是实体bean,因为JPA不喜欢在非实体bean中返回结果。您必须只使用SQL字符串调用createNativeQuery。然后调用query.getResultList将结果作为ListObject[]获取,并使用它填充非实体结果bean


几年前,我写了一篇文章,这可能会帮助您使用JPA执行高级本机查询。

是的,这是可能的,但有点棘手。这里有一个复杂的例子,应该涵盖大多数基础。在本例中:

您有一个具有到期日期的发票对象; 每张发票与一家公司存在多对一关系; 每个发票还与一组项目具有零或一对多关系 以下是模式:

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; }

}
该公司反对:

@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; }

}

是的,这是可能的,但有点棘手。这里有一个复杂的例子,应该涵盖大多数基础。在本例中:

您有一个具有到期日期的发票对象; 每张发票与一家公司存在多对一关系; 每个发票还与一组项目具有零或一对多关系 以下是模式:

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; }

}
该公司反对:

@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; }

}