Hi,
ich stehe gerade vor einem Problem für mein Frontend, dass ich nicht weiß, wie ich meine Daten richtig darstellen soll. Erstmal die Datenstrukturen, um die es geht:
Die Entität, die dargestellt werden soll ist ein Auftrag mit dem beispielhaften Aufbau:
Das "Problem" Daran ist Institute, das sieht nämlich so aus:
Denn dies ist nur ein Sammler für die Historie der Institute. Die eigentlichen Werte sind in der Entität InstituteData:
Theoretisch kann sich in der Lebenszeit eines Institutes auch der Name ändern.
Für das Frontend soll das ungefähr so aussehen:
Das ist so falsch, habe ich festgestellt, weil ich hier zwei Objekte vermische nämlich Institute als value und InstituteData als SelectItem.
Also im Endeffekt möchte ich in den Selectitems zu jedem Institut nur das aktuellste von allen noch aktiven Instituten haben. Das SQL sieht dann ungefähr so aus:
Wie soll ich das denn jetzt im Hintergrund bauen, damit das so funktioniert? Bzw. muss ich vielleicht nur das Frontend anpassen?
ich stehe gerade vor einem Problem für mein Frontend, dass ich nicht weiß, wie ich meine Daten richtig darstellen soll. Erstmal die Datenstrukturen, um die es geht:
Die Entität, die dargestellt werden soll ist ein Auftrag mit dem beispielhaften Aufbau:
Java:
@Entity
@Table(name = "OBJ_ORDER")
public class WindowsOrder implements SearchableEntity {
@Id
@Column(name = "UUID", length = 36)
private String uuid;
@Column(name = "ORDER_NO")
private Integer orderNo;
@Column(name = "POS_NO")
private Integer posNo;
@Column(name = "ORDER_TYPE", length = 50)
@Enumerated(EnumType.STRING)
private OrderType orderType;
@ManyToOne
@JoinColumn(name = "TRANSMISSION_TYPE", referencedColumnName = "UUID" )
private KeyValue transmissionType;
@ManyToOne
@JoinColumn(name = "INSTITUTE_UUID", referencedColumnName = "UUID" )
private Institute client;
}
Java:
@Entity
@Table(name = "OBJ_CLIENT")
public class Institute {
@Id
@Column(name = "UUID", length = 36)
private String uuid;
@OneToMany(mappedBy = "institute")
private Set<InstituteData> timeslices;
}
Java:
@Entity
@Table(name = "OBJ_CLIENT_DATA")
public class InstituteData extends TimeSlice{
@Id
@Column(name = "UUID", length = 36)
private String uuid;
@JoinColumn(name = "CLIENT_UUID", referencedColumnName = "UUID")
private Institute institute;
@Column(name = "CLIENT_STATE",length = 50)
@Enumerated(EnumType.STRING)
private InstituteState state;
@Column(name = "CLIENT_NO",length = 8)
private String clientNo;
@Column(name = "CLIENT_NAME",length = 255)
private String clientName;
@Column(name = "CLIENT_WORKPLACES")
private Integer workplaces;
}
Theoretisch kann sich in der Lebenszeit eines Institutes auch der Name ändern.
Für das Frontend soll das ungefähr so aussehen:
HTML:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
<p:tabView>
<p:tab title="Auftrag">
<p:panel header="Eingang">
<p:panelGrid columns="8">
<p:outputLabel for="@next" value="Auftrag-Nr." />
<p:inputText value="#{proIpsSearchHandler.selectedDetailEntity.orderNo}" required="true">
<f:validateLength minimum="5" />
</p:inputText>
<p:outputLabel for="@next" value="Pos-Nr." />
<p:inputText value="#{proIpsSearchHandler.selectedDetailEntity.posNo}" required="true" />
<p:outputLabel for="@next" value="Auftragsart" />
<p:selectOneMenu value="#{proIpsSearchHandler.selectedDetailEntity.orderType}" required="true">
<f:selectItems value="#{windowsOrderHandler.orderTypes}" />
</p:selectOneMenu>
<p:outputLabel for="@next" value="Eingangsart" />
<p:selectOneMenu value="#{proIpsSearchHandler.selectedDetailEntity.transmissionType}" required="false">
<f:selectItems value="#{windowsOrderHandler.transmissionTypes}" var="trantype" itemValue="#{trantype}" itemLabel="#{trantype.displayname}"/>
</p:selectOneMenu>
<p:outputLabel for="@next" value="Mandant" />
<p:selectOneMenu value="#{proIpsSearchHandler.selectedDetailEntity.client}" required="false">
<f:selectItems value="#{windowsOrderHandler.institues}" var="inst" itemValue="#{inst}" itemLabel="#{inst.clientNo}" itemDescription="#{inst.clientName}"/>
</p:selectOneMenu>
</p:panelGrid>
</p:panel>
</p:tabView>
</ui:composition>
Das ist so falsch, habe ich festgestellt, weil ich hier zwei Objekte vermische nämlich Institute als value und InstituteData als SelectItem.
Also im Endeffekt möchte ich in den Selectitems zu jedem Institut nur das aktuellste von allen noch aktiven Instituten haben. Das SQL sieht dann ungefähr so aus:
SQL:
select * from obj_client_data c where CONCAT(c.client_uuid, c.valid_date) in
(select concat(client_uuid, max(valid_date)) from obj_client_data group by client_uuid)
and client_state = 'PRODUCTIVE';
Wie soll ich das denn jetzt im Hintergrund bauen, damit das so funktioniert? Bzw. muss ich vielleicht nur das Frontend anpassen?