Jakarta ee JPA JoinTable无法访问关联实体的列表?

Jakarta ee JPA JoinTable无法访问关联实体的列表?,jakarta-ee,jpa,jax-rs,Jakarta Ee,Jpa,Jax Rs,我是数据库和JPA的初学者。我的问题是,在查询“项目”时,我无法访问该项目的已启用“Api”列表。具体地说,当我使用命名查询获取结果列表时,代码在这一行失败,并出现以下错误 无状态bean内@GET方法内的行: List<Project> resultList = em.createNamedQuery("Project.queryAllUtorid").setParameter("userid", "a valid user I put into the db").getResu

我是数据库和JPA的初学者。我的问题是,在查询“项目”时,我无法访问该项目的已启用“Api”列表。具体地说,当我使用命名查询获取结果列表时,代码在这一行失败,并出现以下错误

无状态bean内@GET方法内的行:

List<Project> resultList =  em.createNamedQuery("Project.queryAllUtorid").setParameter("userid", "a valid user I put into the db").getResultList();
List<Api> apis = resultList.get(i).getActiveapis();
System.out.println("Size of list: " + apis.size()); //Fails here
我理解错误代码-206表示未指定列或缺少列。这是显而易见的,因为Select语句是使用API的参数应用于ActiveAPI的。我一点也不知道如何进行。我查看了各种示例,但我无法发现代码和示例代码之间的“差异”

我有三个表:db2数据库中的项目、API和ActiveAPI。以下是它们的定义:

CREATE TABLE PROJECTS(
PROJECTID   INTEGER     NOT NULL UNIQUE GENERATED ALWAYS AS IDENTITY (START WITH 10000, INCREMENT BY 1),
PROJECTNAME VARCHAR(60) NOT NULL,
USERID      VARCHAR(30) NOT NULL,
CREATEDAT   TIMESTAMP   NOT NULL generated always for each row on update as row change timestamp,
CONSTRAINT FK_USERID FOREIGN KEY (USERID) REFERENCES USERS (USERID)
);

CREATE TABLE APIS(
APIID   INTEGER         GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
APINAME VARCHAR(100)    NOT NULL,
QUOTA   INTEGER         NOT NULL,
BASEURL     VARCHAR(100)    NOT NULL UNIQUE,
CONSTRAINT PK_APIID PRIMARY KEY (APIID)
);

CREATE TABLE ACTIVEAPIS(
APIID       INTEGER NOT NULL,
PROJECTID   INTEGER NOT NULL,
CONSTRAINT PK_APIID_PROJECTID PRIMARY KEY (APIID, PROJECTID),
CONSTRAINT FK_APIID     FOREIGN KEY (APIID)     REFERENCES  APIS        (APIID),
CONSTRAINT FK_PROJECTID FOREIGN KEY (PROJECTID) REFERENCES  PROJECTS    (PROJECTID)
);
实体:

项目实体:

public class Project implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PROJECTID")
    private Integer projectid;

    @Size(min = 1, max = 60)
    @Column(name = "PROJECTNAME")
    private String projectname;

    @ManyToOne
    @JoinColumn(name = "USERID", referencedColumnName = "USERID")
    private User user;

    @Column(name = "CREATEDAT", insertable=false, updatable=false)
    private Timestamp timestamp;

    //bi-directional many-to-many association to Api
    @ManyToMany
    @JoinTable(name="ACTIVEAPIS",
        joinColumns={
                @JoinColumn(name="PROJECTID", referencedColumnName="PROJECTID")
            }, 
            inverseJoinColumns={
                @JoinColumn(name="APIID", referencedColumnName="APPID")
            }
        )
    private List<Api> activeapis;

public List<Api> getActiveapis() { return activeapis; }

... getters, settings, toString, equals, hashCode
}
我100%确信查询执行正确,因为返回了与用户相关的所有其他信息,包括他的所有项目、项目名称和ID


我真的很感谢你的帮助和再次感谢

JPA的第一个调试过程应该总是在控制台中粘贴SQL,用合理的值替换占位符
,并观察发生了什么。其次应该检查数据库错误信息

在我错误的评论之后,我在谷歌上搜索了“DB2”+[错误消息]并访问了,其中包含以下文本:

SQLSTATE 42703表示:

检测到未定义的列、属性或参数名称


仔细检查您的DDL,您的ActiveAPI表(或API)表中没有定义APPID列。有一个APID,但是…

如果我注释掉任何访问实际列表的行,那么代码不会抛出错误,可能是因为查询没有执行。
public class Project implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PROJECTID")
    private Integer projectid;

    @Size(min = 1, max = 60)
    @Column(name = "PROJECTNAME")
    private String projectname;

    @ManyToOne
    @JoinColumn(name = "USERID", referencedColumnName = "USERID")
    private User user;

    @Column(name = "CREATEDAT", insertable=false, updatable=false)
    private Timestamp timestamp;

    //bi-directional many-to-many association to Api
    @ManyToMany
    @JoinTable(name="ACTIVEAPIS",
        joinColumns={
                @JoinColumn(name="PROJECTID", referencedColumnName="PROJECTID")
            }, 
            inverseJoinColumns={
                @JoinColumn(name="APIID", referencedColumnName="APPID")
            }
        )
    private List<Api> activeapis;

public List<Api> getActiveapis() { return activeapis; }

... getters, settings, toString, equals, hashCode
}
@Entity
@Table(name = "APIS", schema="DB2ADMIN")
public class Api implements Serializable {

    private static final long serialVersionUID = 3L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "APIID")
    private Integer apiid;

    @Column(name = "APINAME")
    private String apiname;

    @Column(name = "QUOTA")
    private int quota;

    @NotNull
    @Column(name = "BASEURL", unique = true)
    private String baseurl;

    //bi-directional many-to-many association to Project
    @ManyToMany(mappedBy="activeapis")
    private List<Project> projects;

    public Api() { super(); }

    public Integer getApiid() { 
        if( apiid == null ) return -1;
        return apiid;
    }
@GET
@Path("project")
@Produces("text/json")
public String queryAllUserProjects(@CookieParam(value = "UID") String userid){
    List<Project> resultList =  em.createNamedQuery("Project.queryAllUserid").setParameter("userid", userid).getResultList();
    String json = "[";
    for ( int i = 0; i < resultList.size(); i++ ) {
        List<Api> apis = resultList.get(i).getActiveapis();
        System.out.println("Size of list: " + apis.size());
        System.out.println(apis.get(0).getApiid());

    }
    System.out.println("GET projects query successful");
    return json + "]";
}
@NamedQueries({
        @NamedQuery(name = "Project.queryAllUserid",
                    query = "SELECT p FROM Project p WHERE p.user.userid LIKE :userid"),
        @NamedQuery(name    = "Project.queryProjectById",
                    query   = "SELECT p FROM Project p WHERE p.projectid LIKE :projectid")
})