@ColumnResult отображается в символ вместо строки в JPA 2.0 - PullRequest
0 голосов
/ 20 ноября 2018

В нашем программном обеспечении требовалось, чтобы отображаемое имя одного пользовательского интерфейса настраивалось в зависимости от пользователя.Таким образом, один пользователь хочет отобразить другой столбец из одной таблицы, а другой пользователь хочет отобразить другой столбец из той же таблицы.Я думаю, что я могу сделать это, используя 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")
...