我的查询返回一个空列表,而不是一个条目

问题描述:

我想从表中得到我的用户: enter image description here我的查询返回一个空列表,而不是一个条目

我通过表单保存此值(所以卡宴配置似乎也不错)。

的UserInfoFactory类:

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类是:

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(); 

但用户列表返回NULL 。

enter image description here 这不应该是null,而是一个值(测试用户)。

我做错了什么?

谢谢,

原因卡宴返回null代替一个目的是,PK场或者在结果集中未发现,或者其值NULL。 在你的情况下,我认为卡宴无法找到结果中的PK,因为它似乎被定义为userid id DB,在Cayenne代码中,我看到它是USERID

请让我给你一些关于你的代码的一般建议。 为每个请求创建ServerRuntime并不是真正有效的解决方案,您应该将其保留为应用程序单例,有关详细信息,请参阅this question。此外,ObjectSelect(或SelectQuery,如果您使用旧版Cayenne)是一种更好(更灵活)的选择对象的方式。

您可以使用它像这样:

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

完美!我非常感谢这个决议,我花了太多时间。我期待像'unreconize USERID'之类的错误。感谢您的改进。我会尽力去做! – Bob

+1

@FannyV欢迎您!至于'unreconize USERID',这是使用SLQTemplate时遇到的一个问题,它试图尽力而为,但默默地失败。 – Nikita

+0

关于你的好建议的问题(感谢那个,对不起,我需要改进/学习'最佳实践'):如果我想选择一个计数(列名),ObjectSelect或SelectQuery是可以的?我应该随时选择PK,对吧?在这种情况下,我应该使用SQL模板吗?我什么时候可以使用SQL模板? – Bob