В нашем программном обеспечении требовалось, чтобы отображаемое имя одного пользовательского интерфейса настраивалось в зависимости от пользователя.Таким образом, один пользователь хочет отобразить другой столбец из одной таблицы, а другой пользователь хочет отобразить другой столбец из той же таблицы.Я думаю, что я могу сделать это, используя SqlResultSetMappings и автоматический запрос имени.Столбец display_name отсутствует в базе данных.Я думаю, что я могу сопоставить имя столбца (в соответствии с выбором пользователя) для displayName.Проблема, Jpa 2.0 не имеет типа в аннотации Columnresult.Таким образом, отображаемое имя возвращает символ.Это мое определение сущности.В этом примере пользователь хочет отобразить краткое имя в пользовательском интерфейсе.Но другой пользователь может захотеть показать имя в пользовательском интерфейсе.
@SqlResultSetMappings({
@SqlResultSetMapping(name = "findAllByTypeList", entities = @EntityResult(entityClass = Element.class, fields = {
@FieldResult(name = "id", column = "ID"), @FieldResult(name = "variant", column = "VARIANT_ID"),
@FieldResult(name = "elementType", column = "ELEMENT_TYPE_ID"),
@FieldResult(name = "name", column = "NAME"),
@FieldResult(name = "shortName", column = "SHORT_NAME"),
@FieldResult(name = "displayName", column = "display_name")
}), columns = {
@ColumnResult(name = "display_name")
})
})
public class Element implements Serializable {
/**
*
*/
private static final long serialVersionUID = 2892631423222044026L;
public Element () {
super();
}
@Id
@Column(name = "ID")
private long id;
@ManyToOne
@JoinColumn(name = "VARIANT_ID")
private Variant variant;
@Column(name = "ELEMENT_TYPE_ID")
private int elementType;
@Column(name = "NAME")
private String name;
@Column(name = "SHORT_NAME")
private String shortName;
@Transient
private String displayName;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Variant getVariant() {
return variant;
}
public void setVariant(Variant variant) {
this.variant = variant;
}
public ElementTypeConstants getElementType() {
return ElementTypeConstants .getInstance(elementType);
}
public void setElementType(NetworkElementTypeConstants elementType) {
this.elementType = elementType.getId();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Element)) {
return false;
}
if (obj == this) {
return true;
}
return ((Element) obj).getName().equals(this.getName());
}
public String toString() {
StringBuffer buf = new StringBuffer("NE ID:");
buf.append(getId());
buf.append(", Name:");
buf.append(getName());
buf.append(", ShortName:");
buf.append(getShortName());
return buf.toString();
}
@Override
public int hashCode() {
return Long.valueOf(id).intValue();
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
Это мой собственный запрос
/** adding table name */
sqlQuery = "select a.id, a.variant_id, a.ELEMENT_TYPE_ID, a.name, a.short_name, a.short_name as display_name from " + conf_element a;
Query query = em.createNativeQuery(sqlQuery
+ " where a.variant_id=:variantId and a.element_type_id in (:elementTypeIdList) order by a.name",
"findAllByTypeList");
query.setParameter("variantId", variantId);
query.setParameter("elementTypeIdList", elementTypeList);
return query.getResultList();
}
PS. В начале я думаю, что я могу реализовать без использованияColumnResult. Следующая строка может сделать работу.
@FieldResult(name = "displayName", column = "display_name")