我有此表,我想将不同的值存储为键和值:
@Entity
@Table(name = "wpf_payment_attributes")
public class WpfPaymentAttributes implements Serializable {
private static final long serialVersionUID = -2629784870868584850L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private int id;
@Column(length = 255)
private String name;
@Column(length = 255)
private String global_ley;
@Column(name = "VALUE", columnDefinition = "TEXT", length = 65535)
private String value;
....
}
WpfPaymentAttributes attibutes = new WpfPaymentAttributes();
attibutes.setName("usage");
attibutes.setValue("Test Usage");
attibutes.setGlobal_key(12333);
WpfPaymentAttributes attibutes = new WpfPaymentAttributes();
attibutes.setName("name");
attibutes.setValue("Peter");
attibutes.setGlobal_key(12333);
但是,如何使用JPA通过一个SQL查询使用相同的全局键获取所有值?问题是我事先不知道表的列和值是什么。
我需要获得以下结构:
usage | name
-------------------
Test Usage | Peter
使用JPA可以吗?
答案 0 :(得分:1)
这是不可能的,因为JPA无法解决某些问题:
WpfPaymentAttributes
值相同
全局密钥和名称(但是,可以使用
数据库约束); name
中可以有任意值
列,因此您必须确保它们实际映射到您的预期结果结构,没有未知的“名称”等。如果您不需要超级通用系统,建议您编写一个简单的映射器,这应该不会很复杂。只需通过特定的WpfPaymentAttributes
获取所有global_key
并应用映射即可。例如,这是您需要的结构:
public class Result {
private String usage;
private String name;
// ...
}
然后:
Result result = new Result();
List<WpfPaymentAttributes> attributes = entityManager.createQuery(
// query should be parameterized
"select a from WpfPaymentAttributes a where global_key = 12333"
).getResultList();
for (WpfPaymentAttributes attribute : attributes) {
String value = attribute.getValue();
switch(attribute.getName()) {
case "name":
result.setName(value);
break;
case "usage":
result.setUsage(value);
break;
default:
throw new IllegalStateException();
}
}
return result;