【问题标题】:How to prevent ClassCastException with JPA entities?如何使用 JPA 实体防止 ClassCastException?
【发布时间】:2015-11-09 03:38:27
【问题描述】:

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

实体

@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

查询/实施

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

更新

这是我尝试将结果对象声明为 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;

【问题讨论】:

  • 试试List&lt;User&gt; records = (List&lt;User&gt;)this.getSession().createQuery(sql).list();
  • 试过了,但仍然得到相同的 ClassCastException
  • 我不确定我是否理解您的问题,但是...SQL Transformers 可能会对您有所帮助。

标签: java database hibernate jpa orm


【解决方案1】:

你应该阅读完整的对象:

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

或者将结果对象声明为List&lt;Object[]&gt;

【讨论】:

  • Jens,阅读完整的对象工作正常。谢谢。但是我需要获取特定的列,所以我试图将结果对象声明为 List 这是否意味着我必须将返回类型更改为对象而不是返回用户记录?
  • @Sunny 你也可以使用 List 作为返回类型。但你必须自己映射它。
【解决方案2】:

您可以使用 generic(我保证您使用的是 java 1.5 及更高版本)并且您会得到结果,然后进行类型检查并向下转换为所需的类型。

【讨论】:

    【解决方案3】:

    如果您不想阅读完整的对象,则必须对特定属性使用 Criteria 和 Projection。

    请参阅this 回答它会有所帮助

    【讨论】:

      【解决方案4】:

      您可以像这样将 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多