Hallo,
folgendes Datenmodell sei gegeben:
Die Entity-Definition von "capitalsources":
Nun folgendes Problem:
Eine capitalsource gehört immer einem User (capitalsources.mur_userid). Mittels capitalsources.att_group_use kann er aber angeben, das diese capitalsource auch von Usern genutzt werden kann, welche auch in seiner Gruppe sind. Die "Nutzung" umschließt aber ausschliesslich lesende Nutzung.
Wenn es darum geht, eine einzelne capitalsource zu finden, eine neue anzulegen, oder eine bestehende zu veraendern, ist der Zugriff auf die "capitalsources" Entitaet richtig.
Wenn es aber darum geht, alle capitalsources-Einträge zu ermitteln, welche man lesen/verwenden darf, soll dies ueber die View geschehen.
Bisher (ohne Hibernate) hatte ich dafür folgende View:
Die Abfrage für userid "4" erfolgt wie folgt:
Wie kann ich die View verwenden beim Auslesen der capitalsources? Aktuell verwende ich zu Testzwecken noch:
Aber das greift halt nur meine ab, und nicht die meiner Gruppenmitglieder.
folgendes Datenmodell sei gegeben:
Code:
mysql> desc capitalsources;
+-----------------+---------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+------------+----------------+
| mur_userid | int(10) unsigned | NO | MUL | NULL | |
| capitalsourceid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| type | enum('1','2') | NO | | 1 | |
| state | enum('1','2') | NO | | 1 | |
| accountnumber | bigint(20) | YES | | NULL | |
| bankcode | bigint(20) | YES | | NULL | |
| comment | varchar(255) | YES | | NULL | |
| validtil | date | NO | | 2999-12-31 | |
| validfrom | date | NO | | 1970-01-01 | |
| att_group_use | tinyint(1) unsigned | NO | | 0 | |
+-----------------+---------------------+------+-----+------------+----------------+
mysql> desc users;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| userid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | UNI | NULL | |
| password | varchar(40) | NO | | NULL | |
| att_new | tinyint(1) unsigned | NO | | NULL | |
| perm_login | tinyint(1) unsigned | NO | | NULL | |
| perm_admin | tinyint(1) unsigned | NO | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
mysql> desc groups;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| groupid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | UNI | NULL | |
+---------+------------------+------+-----+---------+----------------+
mysql> desc user_groups;
+-------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+-------+
| mur_userid | int(10) unsigned | NO | PRI | NULL | |
| mgr_groupid | int(10) unsigned | NO | PRI | NULL | |
| validfrom | date | NO | | NULL | |
| validtil | date | NO | | NULL | |
+-------------+------------------+------+-----+---------+-------+
Die Entity-Definition von "capitalsources":
Java:
@Entity(name = "capitalsources")
public class CapitalSource implements Serializable {
private static final long serialVersionUID = -8858990315543934325L;
@ManyToOne()
@JoinColumn(name = "mur_userid", referencedColumnName = "userid")
private User user;
@Id
private long capitalsourceid;
private int type;
private int state;
private long accountnumber;
private long bankcode;
private String comment;
private Date validtil;
private Date validfrom;
@Column(name = "att_group_use", columnDefinition = "TINYINT(1)")
private boolean attGroupUse;
Nun folgendes Problem:
Eine capitalsource gehört immer einem User (capitalsources.mur_userid). Mittels capitalsources.att_group_use kann er aber angeben, das diese capitalsource auch von Usern genutzt werden kann, welche auch in seiner Gruppe sind. Die "Nutzung" umschließt aber ausschliesslich lesende Nutzung.
Wenn es darum geht, eine einzelne capitalsource zu finden, eine neue anzulegen, oder eine bestehende zu veraendern, ist der Zugriff auf die "capitalsources" Entitaet richtig.
Wenn es aber darum geht, alle capitalsources-Einträge zu ermitteln, welche man lesen/verwenden darf, soll dies ueber die View geschehen.
Bisher (ohne Hibernate) hatte ich dafür folgende View:
Code:
CREATE OR REPLACE SQL SECURITY INVOKER VIEW vw_capitalsources (
mur_userid
,mug_mur_userid
,capitalsourceid
,type
,state
,accountnumber
,bankcode
,comment
,validtil
,validfrom
,att_group_use
) AS
SELECT mcs.mur_userid
,mug.mug2_mur_userid
,mcs.capitalsourceid
,mcs.type
,mcs.state
,mcs.accountnumber
,mcs.bankcode
,mcs.comment
,(CASE
WHEN mug.mug2_mur_userid != mcs.mur_userid AND mcs.validtil > mug.validtil THEN mug.validtil
ELSE mcs.validtil
END)
,(CASE
WHEN mug.mug2_mur_userid != mcs.mur_userid AND mcs.validfrom < mug.validfrom THEN mug.validfrom
ELSE mcs.validfrom
END)
,mcs.att_group_use
FROM capitalsources mcs
,vw_user_groups mug
WHERE ( mug.mug1_mur_userid = mcs.mur_userid
AND mcs.validfrom < mug.validtil
AND mcs.validtil > mug.validfrom
)
OR ( mug.mug1_mur_userid = mcs.mur_userid
AND mug.mug2_mur_userid = mcs.mur_userid
);
Die Abfrage für userid "4" erfolgt wie folgt:
Code:
select * from vw_capitalsources where mug_mur_userid=4 and (mur_userid=4 or att_group_use=1);
Wie kann ich die View verwenden beim Auslesen der capitalsources? Aktuell verwende ich zu Testzwecken noch:
Java:
public List<CapitalSource> getAllValidCapitalSources(User user, Date date) {
String q = "SELECT c from "
+ CapitalSource.class.getName()
+ " c WHERE c.user = :user AND :date BETWEEN c.validfrom AND c.validtil";
Query query = entityManager.createQuery(q);
query.setParameter("user", user);
query.setParameter("date", date);
@SuppressWarnings("unchecked")
List<CapitalSource> capitalSources = query.getResultList();
return capitalSources;
}
Aber das greift halt nur meine ab, und nicht die meiner Gruppenmitglieder.