2016-06-08 3 views
0

Wenn wir ein Backend für die Website erstellen. Wir werden natürlich Kategorien und Beiträge/Produkte erstellen. Zum Hinzufügen/Bearbeiten/Löschen von Kategorien erstellen wir natürlich eine tabellenähnliche Struktur. Beispiel: This is category listing as tableHolen Sie sich die Anzahl der Kinder mit Ruhezustand in springmvc

Kategorie würde eine untergeordnete Kategorie in einer Tabelle haben, die Anzahl der untergeordneten Kategorien könnte 1 - viele sein. Ich möchte die Nummer der Kinderkategorie zeigen, wie ich oben erwähnt habe.

Als CI Entwickler i, dass

in der Ansicht von mit Query zu tun verwenden

Hier ist das Beispiel

<?php 
      if(sizeof($results)>0) 
       {  
       $i=1; 

       foreach($results as $key => $list) 
        { 


        if($i%2==0)$cls="row1"; else $cls="row2"; 
      ?>  
      <tr id="<?php echo $list->id;?>" class="<?php echo $cls; ?>">  
       <td> <?php echo $list->title, anchor("admin/categories/update/".$list->id."/", '<i class="fa fa-pencil rtrt"></i>'); ?></td> 

       <td> 

        <?php 
         // it will return number of childs 
         echo anchor ('admin/categories/category/'.$list->id, $this->Common->select_child ('tbl_category', $list->id)); 
        ?> 
       </td> 

Im Moment bin ich mit Spring-mvc, Hibernate, Jpa und Mysql DB. Ich bin bekannt, dass SQL-Abfrage von einem JSP eine schlechte Übung wäre.

Hier ist meine Jsp-Code für die Tabelle wie Struktur,

<table class="table table-striped"> 
    <thead> 
    <tr> 
     <th><i class="fa fa-pencil"></i></th> 
     <th>Category Name</th> 
     <th>Child</th> 
     <th>Created</th> 
     <th>Updated</th> 
     <th><input type="checkbox" /></th> 
    </tr> 
    </thead> 
    <tbody> 
    <c:if test="${not empty category}"> 
      <c:forEach var="cat" items="${category}"> 
      <tr> 
       <td><a href="${pageContext.request.contextPath}/category/${cat.id}/edit"><i class="fa fa-pencil"></i></a></td> 
       <td>${cat.title}</td> 
       <td><a href="${pageContext.request.contextPath}/category/show/${cat.id}"><i class="fa fa-folder-open"></i></a></td> 
       <td>${cat.created}</td> 
       <td>${cat.updated}</td> 
       <td><input type="checkbox" /></td> 
      </tr> 
     </c:forEach> 
    </c:if> 

Hier ist die Kategorie Pojo Klasse

@Entity 
@Table(name = "categories") 
public class Categories { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 

private Long parent_id; 

private String title; 

private String url_title; 

private String description; 

private String created; 

private String updated; 

/* 
* @ At the time of Creating new user 
* Auto persist created date 
* Auto persist updated for first time 
*/ 
@PrePersist 
protected void onCreate(){ 

    // Date conversion to string 
    Date date = new Date(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd h:mm:s"); 
    sdf.setLenient(false); 
    String now = sdf.format(date); 

    created = now; 
    updated = now; 


} 


/* 
* Respective Getter and Setter Methods 
* 
*/ 
public Long getId() { 
    return id; 
}public void setId(Long id) { 
    this.id = id; 
} 

public Long getParent_id() { 
    return parent_id; 
}public void setParent_id(Long parent_id) { 
    this.parent_id = parent_id; 
} 

public String getTitle() { 
    return title; 
}public void setTitle(String title) { 
    this.title = title; 
} 

public String getUrl_title() { 
    return url_title; 
}public void setUrl_title(String url_title) { 
    this.url_title = url_title; 
} 

public String getCreated() { 
    return created; 
}public void setCreated(String created) { 
    this.created = created; 
} 

public String getUpdated() { 
    return updated; 
}public void setUpdated(String updated) { 
    this.updated = updated; 
} 

public String getDescription() { 
    return description; 
}public void setDescription(String description) { 
    this.description = description; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Categories other = (Categories) obj; 
    if (id == null) { 
     if (other.id != null) 
      return false; 
    } else if (!id.equals(other.id)) 
     return false; 
    return true; 
} 

Die Frage ist

Wie kann ich Kinder zählen ohne SQL-Abfrage von Jsp? Bitte helfen Sie mir, ich brauche einen Vorschlag.

+0

Können Sie die Kategorie entity pleaz hinzufügen? –

+0

Ich habe gerade die Kategorien Klasse hinzugefügt? kannst du mir bitte vorschlagen, wie ich das erreiche, was ich brauche. –

+0

Ich habe eine Antwort geschrieben, aber ich weiß nicht, was Sie wirklich meinen: ** Kinder zählen ** –

Antwort

0

wie unten eine Liste Zahl auf jsp Seite Verwendung jstl Funktionen erhalten:

die taglibe von jstl.functions

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

dann können Sie diese

<c:set var="count" value="${fn:length(you_array)}" /> 

dieser Wille versuchen zu erklären Erstelle eine Variable "count" als Wert: you_array.size()

0

Hoffnung es jemanden wie mir helfen,

Modified Entitätsklasse

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 

private Long parent_id; 
private String title; 
private String url_title; 
private String description; 
private Long status; 
private String created; 
private String updated; 

@ManyToOne 
@JoinColumn(
name="parent_id", 
insertable=false, 
updatable=false) 
@NotFound(action = NotFoundAction.IGNORE) 
private Categories parentCategory; 

@OneToMany(
fetch = FetchType.EAGER, 
mappedBy="parentCategory", 
cascade=CascadeType.REMOVE, 
orphanRemoval=true) 

private Set<Categories> child = new HashSet<Categories>(); 

Da ich zu JPA bin neu/ORM// Frühling überwintern, wenn ich diese Frage gepostet ich nicht über Entität hat wusste Beziehung, die wir im Winterschlaf bewältigen können. Ich habe etwas Forschung und herausgefunden über Hibernate 'Uni/Bi directional' Verbindung mit Annotation wie (eins zu viele, viele zu eins, viele zu vielen). Ich schlage vor, wenn Sie JPA neu sind und überwintern, dann besuchen Sie bitte This link, bevor Sie Ihre Zeit verschwenden.

Was ich mit

Bidirektionale Assoziationen getan haben beitreten: mit @ManyToOne @OneToMany @joinColumn

NOTFOUND Ausnahme Lösen mit @NotFound (NotFoundAction.IGNORE) Ich habe a Kategorien (z. B. Basiskategorie), die keine übergeordnete Kategorie haben, so dass ihre "parent_id" in der Datenbank 0 ist, aber Hibernate löst eine Ausnahme aus, während Datensätze aus der Datenbank mit der ID 0 nachher abgefragt werden eine erfolgreiche Verbindung.

Verwendet insertable/updatable = false: Setzen Sie diese Eigenschaften auf false, wenn Sie nur jeweils eine Kategorie einfügen und aktualisieren.

Verwendet "cascade = cascadetype.remove" "orphanremoval = true": Legen Sie diese Eigenschaften fest, wenn Sie untergeordnete Kategorien löschen möchten, wenn Sie die übergeordnete Kategorie löschen. Wenn Sie Ihre serviceImplementation.delete (Kategorie cat) -Methode aufrufen, wenn "cat: object" für andere Kategorien übergeordnet ist, löscht hibernate automatisch seine untergeordneten Kategorien, bevor cat: object selbst gelöscht wird.

Endlich die Antwort für meine Frage

Nach der erfolgreichen Zusammenarbeit mit Kommentierung, wenn Sie Kategoriezeilen aus der Datenbank abfragt. Wenn es sich um eine übergeordnete Kategorie für andere Kategorien handelt, fügt Hibernate in Ihrem Objekt "untergeordnete Sammlung" hinzu.

03:20:16.490 [http-bio-8080-exec-5] DEBUG 
o.h.internal.util.EntityPrinter - 
com.pack.librarymanagementsystem.model.Categories 
{created=2016-06-10 7:45:32, parent_id=38, url_title=Bhm 5th sem, 
description=<p>asd</p>, 
parentCategory=com.pack.librarymanagementsystem.model.Categories#38, 
id=43, title=Bhm 5th sem, updated=2016-06-10 7:45:32, child=[], status=1} 

Überprüfen Sie es in Ihrem Konsolenprotokoll, wenn Sie Eclipse verwenden. Die Kindersammlung, die gerade hinzugefügt wurde, hat keine Daten. Hibernate speichert nur Proxys.

Die Lösung besteht darin, die Größe einer untergeordneten Sammlung zu ermitteln.

Wenn Sie isEmpty() Scheck auf das Kind Sammlung ist das Ergebnis wahr machen wird. Das ist, wo die "fetch = FetchType.EAGER" Kicks in. Standardmäßig ist fetchtype auf faul gesetzt. Nach dem Ändern von fetchtype in den eifrigen Ruhezustand werden Objekte als untergeordnetes Element hinzugefügt, anstatt einen Proxy hinzuzufügen.

Wenn Sie isEmpty überprüfen Sie auf diese untergeordnete Sammlung jetzt, das Ergebnis wird falsch sein. Das bedeutet, dass wir die Größe einer Sammlung erhalten können.

Dies ist die jsp

<c:if test="${not empty category}"> 
<c:forEach var="cat" items="${category}"> 
<tr> 
    <td><a href="${pageContext.request.contextPath}/category/${cat.id}/edit"><i class="fa fa-pencil"></i></a></td> 
    <td>${cat.title}</td> 
    <td> 
     // Child count 
     <c:if test="${not empty cat.child}" > 
      <a href="${pageContext.request.contextPath}/category/show/${cat.id}"> 
       <i class="fa fa-folder-open"></i> ${ fn:length(cat.child)} 
      </a>  
     </c:if> 
     <c:if test="${empty cat.child}" > 
      <i class="fa fa-folder"></i> 0 
     </c:if> 
    </td> 
    <td>${cat.created}</td> 
    <td>${cat.updated}</td> 
    <td> 
     <c:choose> 
      <c:when test="${cat.status == 1}">Published</c:when> 
      <c:otherwise>Unpublished</c:otherwise> 
     </c:choose> 
    </td> 
    <td><input type="checkbox" name="ids[]" id="ids[]" value="${cat.id}" /></td> 
</tr> 
</c:forEach> 

Und dies ist der Controller

@RequestMapping(value = "/show/", method = RequestMethod.GET) 
public String viewCategory(Map<String, Object> model) { 

List<Categories> category = categoryService.getAllCategoriesByParent(Id); 
model.put("category",category); 

return "category/view"; 
} 

Ich hoffe, das jemand helfen würde, sein/ihr auf Spar Zeit. Vielen Dank

Verwandte Themen