从另一个对象包含到Lombok ToString字段中

时间:2017-03-07 13:27:31

标签: java tostring lombok

我有这个POJO

//@ToString(of = { "id", "name", "employee.id - not working" })
@ToString(of = { "id", "name", "employee - working" })
public class Company {

    private int id;
    private String name;

    @OneToMany(mappedBy="company")
    private Set<Employee> employee;
}

public class Employee{

    private int id;
    private String name;

    @ManyToOne
    private Company company;
}

如何从对象员工打印 id ? 我不想打印整个对象员工,只打印一个字段。

谢谢

1 个答案:

答案 0 :(得分:2)

您有几种选择。

  1. 在公司中编写一个方法,根据需要序列化员工集,然后让Lombok排除&#34;员工&#34;并改为使用你的getter。如果你不喜欢冗余字段的丑陋,那就不好了(见下文)。
  2. 为公司编写自定义toString方法。如果你想坚持使用Lombok解决方案,那就不好了。
  3. 将Employee的ToString设置为仅使用id。如果您想在其他地方打印其余的Employee字段,那就不好了。
  4. 方法(1)的一个例子:

    @ToString(of = {"id", "name", "employeeIdList"})
    public class Company {
    
        private int id;
        private String name;
    
        @OneToMany(mappedBy="company")
        private Set<Employee> employee;
    
        private Set<Integer> employeeIdList; // unused field
        private Set<Integer> getEmployeeIdList() {
                // Return a set of employee ids only
                return employee.stream()
                    .map(e -> e.getId()).collect(Collectors.toSet());
        }
    }
    

    请注意,您需要拥有该字段才能让Lombok识别出getter。但是,该领域本身从未使用过。我承认,这是丑陋的,虽然两个领域都是私有的,但是部分减轻了。

    方法(2)的一个例子:

    public class Company {
    
        private int id;
        private String name;
    
        @OneToMany(mappedBy="company")
        private Set<Employee> employee;
    
        @Override
        public String toString() {
                String ids = "";
                for (Employee e : employee) {
                    if (! ids.isEmpty())
                        ids += ", ";
                    ids += e.getId();
                }
                return "Company(id="+id+", name="+name+", employees=["+ids+"])";
        }
    }
    
相关问题