Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 如何使用JPA实体防止ClassCastException?_Java_Database_Hibernate_Jpa_Orm - Fatal编程技术网

Java 如何使用JPA实体防止ClassCastException?

Java 如何使用JPA实体防止ClassCastException?,java,database,hibernate,jpa,orm,Java,Database,Hibernate,Jpa,Orm,当试图查询我的JPA实体类时,我得到一个ClassCastException。我只希望json显示两列。那是姓名和地址。如何在JPA中仅显示选定的列?从调试开始,它必须是for循环。所以列表就是对象,我需要把右边变成一个对象,而不是正确的列表 实体 @Entity @Table(name = "Personnel") public class User implements Serializable { private String id; private String name; priva

当试图查询我的JPA实体类时,我得到一个ClassCastException。我只希望json显示两列。那是姓名和地址。如何在JPA中仅显示选定的列?从调试开始,它必须是for循环。所以列表就是对象,我需要把右边变成一个对象,而不是正确的列表

实体

@Entity
@Table(name = "Personnel")
public class User implements Serializable {

private String id;
private String name;
private String address;

public User(String id, String name, String address) 
{
this.id = id;
this.name = name;
this.address = address;
}

@Id
@Column(name = "name", unique = true, nullable = false)
public String getName() {
    return this.name;
}....
 //setters getters
查询/Impl

public List<User> getRecords(User ent){

     String sql = "select "
                + " usr.name, usr.address "                 
                + " from User usr"           
                + " where usr.id = '1' ";

    List<User> records = this.getSession().createQuery(sql).list();
    for ( User event : records ) {
        System.out.println( "Records (" + event.getName + ") );
    }

    return records;
 }
公共列表获取记录(用户ent){
String sql=“选择”
+usr.name,usr.address
+“来自用户usr”
+其中usr.id='1';
列表记录=this.getSession().createQuery(sql).List();
for(用户事件:记录){
System.out.println(“记录(“+event.getName+”));
}
退货记录;
}
更新

这是我试图将结果对象声明为List。该方法是否必须是对象而不是对象

public List<User> getRecords(User ent){
     String sql = "select "
                + " usr.name, usr.address "                 
                + " from User usr"           
                + " where usr.id = '1' ";

       Map<String, String> results = new HashMap<String, String>();
       List<Object[]> resultList = this.getSession().createQuery(sql).list();

       // Place results in map
       for (Object[] items: resultList) {
          results.put((String)items[0], (String)items[1]);
          results.toString();
       }
       return (List<User>) results;
公共列表获取记录(用户ent){
String sql=“选择”
+usr.name,usr.address
+“来自用户usr”
+其中usr.id='1';
映射结果=新的HashMap();
List resultList=this.getSession().createQuery(sql).List();
//将结果放置在地图中
对于(对象[]项:结果列表){
结果。放置((字符串)项[0],(字符串)项[1]);
结果:toString();
}
返回(列表)结果;

您应该阅读完整的对象:

String sql = " from User usr"           
            + " where usr.id = '1' ";

或者将结果对象声明为
List

您可以使用generic(我保证您使用的是Java1.5及更高版本)一旦得到结果,就进行类型检查并向下转换到所需的类型。

如果不想读取完整的对象,就必须使用特定属性的条件和投影


请参见回答它将有帮助

您可以将DTO类传递给SELECT子句,如下所示:

List<UserDTO> resultList = this.getSession().createQuery("""
    select
        new my.package.UserDTO(usr.name, usr.address)
    from User usr
    where usr.id = :userId
    """)
.setParameter("userId", userId)
.getResultList();
List resultList=this.getSession().createQuery(“”)
选择
新建my.package.UserDTO(usr.name,usr.address)
来自用户usr
其中usr.id=:userId
""")
.setParameter(“userId”,userId)
.getResultList();

Try
List records=(List)this.getSession().createQuery(sql.List())
尝试了此操作,但仍然得到相同的ClassCastException我不确定是否理解您的问题,但是…可能会帮助您。Jens,阅读完整的对象很好。谢谢。但是我需要获取特定的列,因此我尝试将结果对象声明为列表。这是否意味着我必须将返回类型更改为对象而不是是否返回用户记录?@Sunny您也可以使用该列表作为返回类型。但您必须自己映射它。