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