我的查询 return 一个空列表而不是一个条目

My query return a null list instead of one entry

我正在尝试从 table 获取我的用户:

我通过表格保存了这些值(所以 cayenne 配置似乎不错)。

UserInfoFactory class 是:

public class UserInfoFactory extends _UserInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    public static ObjectContext getContext() {
        @SuppressWarnings("deprecation")
        ServerRuntime runtime = new ServerRuntime("cayenne-myapplication.xml");
        return runtime.newContext();
    }

    @SuppressWarnings("unchecked")
    public static List<UserInfoFactory> getUsersInfo() {

        SQLTemplate select = new SQLTemplate(UserInfoFactory.class,
                "SELECT * FROM mam.userinfo");

        return getContext().performQuery(select);
    }
}

我的 _UserInfo class 是:

package com.example.myapplication.model;

import org.apache.cayenne.CayenneDataObject;

/**
 * Class _UserInfo was generated by Cayenne.
 * It is probably a good idea to avoid changing this class manually,
 * since it may be overwritten next time code is regenerated.
 * If you need to make any customizations, please use subclass.
 */
public abstract class _UserInfo extends CayenneDataObject {

    public static final String ADDRESS_PROPERTY = "address";
    public static final String EMAIL_PROPERTY = "email";
    public static final String FIRSTNAME_PROPERTY = "firstname";
    public static final String LASTNAME_PROPERTY = "lastname";
    public static final String PHONENUMBER_PROPERTY = "phonenumber";
    public static final String USERPASSWORD_PROPERTY = "userpassword";
    public static final String USERPRIVILEGES_PROPERTY = "userprivileges";

    public static final String USERID_PK_COLUMN = "USERID";

    public void setAddress(String address) {
        writeProperty(ADDRESS_PROPERTY, address);
    }
    public String getAddress() {
        return (String)readProperty(ADDRESS_PROPERTY);
    }

    public void setEmail(String email) {
        writeProperty(EMAIL_PROPERTY, email);
    }
    public String getEmail() {
        return (String)readProperty(EMAIL_PROPERTY);
    }

    public void setFirstname(String firstname) {
        writeProperty(FIRSTNAME_PROPERTY, firstname);
    }
    public String getFirstname() {
        return (String)readProperty(FIRSTNAME_PROPERTY);
    }

    public void setLastname(String lastname) {
        writeProperty(LASTNAME_PROPERTY, lastname);
    }
    public String getLastname() {
        return (String)readProperty(LASTNAME_PROPERTY);
    }

    public void setPhonenumber(Integer phonenumber) {
        writeProperty(PHONENUMBER_PROPERTY, phonenumber);
    }
    public Integer getPhonenumber() {
        return (Integer)readProperty(PHONENUMBER_PROPERTY);
    }

    public void setUserpassword(String userpassword) {
        writeProperty(USERPASSWORD_PROPERTY, userpassword);
    }
    public String getUserpassword() {
        return (String)readProperty(USERPASSWORD_PROPERTY);
    }

    public void setUserprivileges(Short userprivileges) {
        writeProperty(USERPRIVILEGES_PROPERTY, userprivileges);
    }
    public Short getUserprivileges() {
        return (Short)readProperty(USERPRIVILEGES_PROPERTY);
    }

}

我正在调用这样的方法:

List<UserInfoFactory> users = UserInfoFactory.getUsersInfo();

但用户列表 return 为空。

那不应该是空的,而是一个值(测试用户)。

我做错了什么?

谢谢,

Cayenne 使用 return null 而不是对象的原因是 PK 字段在结果集中未找到或其值为 NULL。 在你的情况下,我认为 Cayenne 在结果中找不到 PK,因为它似乎被定义为 userid id DB,在 Cayenne 代码中我看到它是 USERID.

请允许我就您的代码给您一些一般性建议。 为每个请求创建 ServerRuntime 并不是真正有效的解决方案,您应该将其保留为应用程序单例,如果您使用的是旧版本的 Cayenne,请参阅 for details. Moreover ObjectSelect (or SelectQuery)是一种更好(并且确实更灵活)的选择对象的方式。

你可以这样使用它:

List<UserInfoFactory> result = ObjectSelect.query(UserInfoFactory.class)
                                     .select(context);