Hibernate可以选择连接表而不包括某些行

时间:2015-05-28 08:10:05

标签: java hibernate join

我使用Hibernate来控制我的数据库,我有2个表:

CREATE TABLE IF NOT EXISTS `User`(
    `id`        INT             NOT NULL    AUTO_INCREMENT,
    `name`      VARCHAR(255)    NOT NULL    DEFAULT '',
    `account`       VARCHAR(255)    NOT NULL    DEFAULT '',
    `password`      VARCHAR(255)    NOT NULL    DEFAULT '',
    PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `Project` (
    `id`        INT             NOT NULL    AUTO_INCREMENT,
    `manager`   INT             NOT NULL,   
    `name`      VARCHAR(255)    NOT NULL    DEFAULT '', 
    PRIMARY KEY (`id`),
    FOREIGN KEY (`manager`) REFERENCES `User`(`id`)
)

我完成了映射:

用户:

// ... import code
@Entity
@Table
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column
    private String name, account, password;

    @OneToMany(mappedBy = "manager")
    private List<Project> projects;

    public User() {
    }
    //  ... Getter & Setter code
}

项目:

// ... import code
@Entity
@Table
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column
    private String name;

    @ManyToOne
    @JoinColumn(name = "manager")
    private User manager;

    public Project () {
    }
    //  ... Getter & Setter code
}

我想知道在选择项目时是否可行,项目将包含其经理数据但没有密码。

在其他方面,我希望我得到的每个项目都是这样的(格式为JSON):

{
    "id": 0,
    "name": "A test project",
    "manager": {
        "id": 0,
        "name": "John Smith"
        "accound": "user1",
        "password": null
    }
}

2 个答案:

答案 0 :(得分:1)

1。投影

可以使用projection来限制您想要带入内存的字段,您可以获得除password之外的所有字段的投影。

2。懒惰

另一个选项可以是在字段中添加延迟注释:

@Basic(fetch = FetchType.LAZY)
@Column(...)
private String password;

3。 HQL查询

另一种方法是使用直接HQL查询并仅加载this answer所需的字段。

答案 1 :(得分:0)

如果您根本不想映射此字段,可以使用@Transient注释:

@Transient
private String password;

如果您只是在将对象转换为特定JSON表示时根本不想显示此字段,那么这是一个数据表示问题,而不是ORM映射问题。将对象转换为JSON时,应跳过此字段。实现取决于您使用的JSON转换器。例如,如果您使用Jackson,那么@JsonIgnore注释就是您所需要的。