Java 任意';列';从hibernate查询中的HashMap

Java 任意';列';从hibernate查询中的HashMap,java,hibernate,jsf,el,Java,Hibernate,Jsf,El,假设我有一个实体用户 public class User { private String username; private String password; private Map<String, Object> settings = new HashMap<String, Object>(); //Getters & setters } 公共类用户{ 私有字符串用户名; 私有字符串密码; 私有映射设置=新建HashMap

假设我有一个实体用户

public class User {
    private String username;
    private String password;

    private Map<String, Object> settings = new HashMap<String, Object>();

    //Getters & setters
}
公共类用户{
私有字符串用户名;
私有字符串密码;
私有映射设置=新建HashMap();
//接球手和接球手
}
有什么方法可以在查询中使用设置映射的键吗? 例如:

criteria crit=mySession.createCriteria(User.class);
标准添加(Restrictions.eq(“settings.blah”,1234L));
列表结果=crit.List();
或者通过EL访问地图值? 例如:


我可以通过一个简单的@OneToMany映射部分地实现这一点,但这需要我的查询同时使用key和value,并且属性不能通过EL访问

这样的事情可能吗?我如何用注释映射它

谢谢

编辑:
本质上,我所追求的是一个“垂直表”实现,这样我就可以拥有任意字段,并且仍然能够将实体用作映射类。我不知道hibernate是否可以这样做。

我从不将用户对象作为映射的值,您可以将字符串用于此映射:

@Entity
public class User {

private int _id;
private Map<String, String> _settings;

public User() {

}

@Id
@GeneratedValue
public int getId() {
    return _id;
}

public void setId(int id) {
    _id = id;
}

@ElementCollection
@MapKeyColumn(name = "SETTINGS_KEY")
@CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "SETTING")
public Map<String, String> getSettings() {
    return _settings;
}

public void setSettings(Map<String, String> settings) {
    _settings = settings;
}

}
@实体
公共类用户{
私人内部id;
私人地图设置;
公共用户(){
}
@身份证
@生成值
公共int getId(){
返回_id;
}
公共无效集合id(内部id){
_id=id;
}
@元素集合
@MapKeyColumn(name=“SETTINGS\u KEY”)
@CollectionTable(name=“USER\u SETTINGS”,joinColumns=@JoinColumn(name=“USER\u id”))
@列(name=“SETTING”)
公共地图设置(){
返回设置;
}
公共无效设置设置(地图设置){
_设置=设置;
}
}
如果需要使用不同类型的列,则必须使用接口作为映射的值,如下所示:

@Entity
public class TestSettings {

    private int _id;
    private Map<String, SettingValue<?>> _settings;

    public TestSettings() {

    }

    @Id
    @GeneratedValue
    public int getId() {
        return _id;
    }

    public void setId(int id) {
        _id = id;
    }

    @OneToMany
    @MapKeyColumn(name = "SETTINGS_KEY")
    @CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "SETTING")
    public Map<String, SettingValue<?>> getSettings() {
        return _settings;
    }

    public void setSettings(Map<String, SettingValue<?>> settings) {
        _settings = settings;
    }

}
@实体
公共类测试设置{
私人内部id;
私有映射>获取设置(){
返回设置;
}
公共空间设置(地图)
@Entity
public class User {

private int _id;
private Map<String, String> _settings;

public User() {

}

@Id
@GeneratedValue
public int getId() {
    return _id;
}

public void setId(int id) {
    _id = id;
}

@ElementCollection
@MapKeyColumn(name = "SETTINGS_KEY")
@CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "SETTING")
public Map<String, String> getSettings() {
    return _settings;
}

public void setSettings(Map<String, String> settings) {
    _settings = settings;
}

}
@Entity
public class TestSettings {

    private int _id;
    private Map<String, SettingValue<?>> _settings;

    public TestSettings() {

    }

    @Id
    @GeneratedValue
    public int getId() {
        return _id;
    }

    public void setId(int id) {
        _id = id;
    }

    @OneToMany
    @MapKeyColumn(name = "SETTINGS_KEY")
    @CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "SETTING")
    public Map<String, SettingValue<?>> getSettings() {
        return _settings;
    }

    public void setSettings(Map<String, SettingValue<?>> settings) {
        _settings = settings;
    }

}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class SettingValue<V> implements Serializable {

    private static final long serialVersionUID = 3355627640146408150L;

    private Integer _id;

    public SettingValue() {
        super();
    }

    @Id @GeneratedValue
    public Integer getId() {
        return _id;
    }

    public void setId(Integer id) {
        _id = id;
    }

    @Transient
    public abstract V getValue();

    public abstract void setValue(V value);

}
@Entity
@PrimaryKeyJoinColumn(name="settingvalue_id", referencedColumnName="id")
public class TextSettingValue extends SettingValue<String> implements Serializable {

    private String _value;

    public TextSettingValue() {
        super();
    }

    @Override
    public void setValue(String value) {
        _value = value;
    }

    @Override
    public String getValue() {
        return _value;
    }

}