如何制作列表<subset of =“”attributes =“”of =“”table =“”class =“”> = list <all attributes =“”of =“”table =“”class =“”> in Java的

时间:2017-08-06 04:50:05

标签: java hibernate subclass

我有一个由Hibernate生成的Java类,它代表一个表

示例:

public class Customer implements java.io.Serializable {

    private static final long serialVersionUID = -9144431342277803632L;

    private BigDecimal customerid;
    private String custcompanyname;
    private String firstname;
    private String lastname;
    private String address;

    ... <getters and setters>

}

我想做的是创建一个使用上面列出的属性子集的类。例如:

public class CustomerShortInfo  {

        private BigDecimal customerid;
        private String firstname;
        private String AddInNewFieldHere; << add in new field that is Not part of Customer

        ... <getters and setters>
}

为了做这样的事情:

List<CustomerShortInfo> = List<Customer>

我试图避免创建一个遍历List的循环,以便手动进行分配。我已经看到一个人可以做一个“子类” - 但是 - 据我所知,这将需要类似的东西:

public class CustomerShortInfo  extends Customer {

        private BigDecimal customerid;
        private String firstname;

        ... <getters and setters>
}
  

同样,“Customer”是由Hibernate创建的添加/删除的类   表中的行。 Customer的每个属性都匹配一列   数据库表。

结果如下:

List<CustomerShortInfo> shortcustomerlist;

List< ? extends Customer> longcustomerlist = shortcustomerlist;

所需要的是分配方向相反。以下示例为:

List<CustomerShortInfo> = List<Customer>

可以这样做吗?如果是这样,怎么样?

TIA

更新2

有没有可靠的方法让代码在下面工作?截至目前,我得到以下内容:

  

线程“main”中的异常java.lang.ClassCastException:   ccinfw.main.test.First不能强制转换为ccinfw.main.test.Second at   ccinfw.main.test.TestAssign.main(TestAssign.java:22)

public class TestAssign {

    public static void main(String[] args) {

         List<First> firstList = new ArrayList<>();
         First firstitem = new First();
         firstList.add(firstitem);

         List<Second> secondList = new ArrayList<>();


         secondList = (List<Second>)(List<?>) firstList;

         System.out.println(" A is " + secondList.get(0).getA()); 
         System.out.println(" B is " + secondList.get(0).getB()); 
         System.out.println(" X is " + secondList.get(0).getX()); 
         System.out.println(" Z is " + secondList.get(0).getZ()); 

    }
}


class Second {

    int b = 3000;
    int a = 4000;
    int z = 5000;
    int x = 9000;

    public int getA() { return a; }
    public int getB() { return b; } 
    public int getZ() { return z; } 
    public int getX() { return x; } 
}


class First  {

    int b = 30;
    int a = 40;
    int c = 10;
    int d = 20;
    int e = 80;
    int f = 90;

    public int getC() { return c; }
    public int getD() { return d; }
    public int getE() { return e; }
    public int getF() { return f; }
    public int getA() { return a; }
    public int getB() { return b; }  

}

更新1 在这种情况下使用子类不适用于我想要做的事情。使用子类时,可以从子类(Customer)访问超类( CustomerShortInfo )的所有属性。 CustomerShortInfo的属性需要单独使用/使用。当提到A是B的子类时,它只是描述了情况。

例如,如果A类具有以下属性:

length
height
width
weight
color
manufacturer

和B类具有属性 重量 生产厂家 NumberOfTires

请注意“超级班级”中的“NumberOfTires”不是

然后,如果执行了以下行:

B = copy of (A)

然后我会有

weight        <<<< values comes from A
manufacturer  <<<< value comes from A
NumberOfTires <<<< Value Not Set from A (since it is not there)
  

为什么从A复制时会设置“制造商”和“重量”?   因为它们具有相同的属性名称。如果我被赋予了“打印B的所有属性”的任务。

如果我有一个任务要打印出B的属性所有,我会得到:

weight, manufacturer, NumberOfTires

而不是

ALL of the attributes of A + NumberOfTires

如果这样的副本不可能,那么在循环遍历列表(在本例中为Customer)时,必须使用许多“getter”和“setter”来完成这项工作。这就是我试图避免的。

因此,非常感谢任何有关如何做到这一点的建议。

1 个答案:

答案 0 :(得分:0)

为了得到我需要做的事,做完了,我用了Dozer。完成工作后我所遵循的链接如下。

{{1}}