# MySQl Datenbank als Array ausgeben



## TeamBob (23. Feb 2009)

Hi
Also ich habe einen Suchbefehl programmiert, der eine MySql Datenbank nach dem eingegeben Wort
durchsucht. Ich will das diese gefunden Dokumente als eine Liste zurückgegeben werden und
man diese dann auswählen kann um sie zu öffnen. 
Weis jemand wie ich das verwirklichen könnte, weil ich habe dafür echt keinen Ansatz.
Danke


----------



## ARadauer (23. Feb 2009)

ja du holst dir die Werte aus dem Resultset und fügst sie in eine ArrayList ein...

zeig mal deinen Code...


----------



## TeamBob (23. Feb 2009)

Also die Suchfunktion steckt in einen Project drin wo ich jetzt den Webservice programmiere zu der diese
Suchfunktion verwenden soll. 

Die Suchfunktion im Project

```
public List<Document> searchInDocumentFieldsForSimpleSearch(
			final String and_search, final Long userId) {

		final List<Long> documentIds = new ArrayList<Long>(0);
		final List<Long> visibledocumentsForUser_ids = new ArrayList<Long>(0);
		final List<Document> documents = new ArrayList<Document>(0);

		final Session session = sf.openSession();
		final FullTextSession fullTextSession = Search
				.createFullTextSession(session);

		// determine visible documents by user
		visibledocumentsForUser_ids.addAll(dfl
				.getVisibleDocumentsByUser(userId));

		final String newSearch = and_search.trim();
		final Query luceneQuery = createInputFieldQuery(newSearch,
				BooleanClause.Occur.MUST, false);

		final org.hibernate.Query fullTextQuery = fullTextSession
				.createFullTextQuery(luceneQuery, Document.class);
		final Iterator it = fullTextQuery.iterate();

		// while (it.hasNext()) {
		// final DocumentField df = (DocumentField) it.next();
		// if (df != null) {
		// if (!documentIds.contains(df.getDocumentId())
		// && (visibledocumentsForUser_ids
		// .contains(df.getDocumentId()))) {
		// final Document dd = df.getDocument();
		// if(dd!=null){
		// if(Hibernate.isInitialized(dd)==false){
		// Hibernate.initialize(dd);
		// }
		// documentIds.add(dd.getId());
		// documents.add(dd);
		// }
		// }
		// }
		// }

		while (it.hasNext()) {
			final Document d = (Document) it.next();
			if (d != null) {
				if (!documentIds.contains(d.getId())
						&& (visibledocumentsForUser_ids.contains(d.getId()))) {
					documentIds.add(d.getId());
					documents.add(d);
				}
			}
		}

		/*
		 * visibledocumentsForUser_ids.addAll(dfl
		 * .getVisibleDocumentsByUser(userId));
		 * 
		 * Iterator is = documentFields.iterator(); while (is.hasNext()) {
		 * DocumentField df = (DocumentField) is.next(); if(df!=null){ Document
		 * dd = df.getDocument(); dd.getAuthors(); if
		 * (!documentIds.contains(dd.getId()) &&
		 * (visibledocumentsForUser_ids.contains(dd.getId()))) {
		 * 
		 * documentIds.add(dd.getId()); documents.add(dd); // System.out //
		 * .println("###### Document " + dd.getName() + " " // +
		 * dd.getCreationDate() + " " // + dd.getModificationDate()); // hier
		 * implemantation für die categorien anzeige ?? } } }
		 */
		return documents;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seede SearchLocal#
	 * getAllDocumentsByUserCommunitiesAndByReleaseStatus(java.lang.Long)
	 */
```

Mein Aufruf der Methode im Webservice

```
@WebMethod
 	public String searchInDocumentFieldsForSimpleSearch(final String and_search, final Long userId)
 		{
	
	    return and_search;
 		}
```


----------



## ARadauer (23. Feb 2009)

wow mit dem habe ich jetzt nicht gerechnet. wie lange arbeitest du schon mit java?
lucene, webservices... bist du dir sicher, dass du schon so weit bist?

warum machst du alles final?



> Ich will das diese gefunden Dokumente als eine Liste zurückgegeben werden


das wird meiner meinung schon gemacht



> diese dann auswählen kann um sie zu öffnen


??? was sind das für Document Objekte?


----------



## TeamBob (23. Feb 2009)

Hi
Also erstmal danke für deine schnelle Hilfe.
Also diese Suchfunktion stammt nicht von mir. Diese wurde von einen 
meiner kollegen entworfen und ich bin jetzt im Moment für den 
Webservice zuständig dafür. 

Also wo genau wird denn da schon in Array umgewandelt?
Ich muss ihn aber doch noch irgendwo sagen das er die Sache 
von der ResultSet von Mysql nehmen soll oder etwa nicht und die
MySql suche muss doch auch noch gestartet werden oder irre ich mich
jetzt. Ich stecke gerade total fest. Der webserive kommuniziert schon 
mit einfachen Anwendungen aber nun muss die Suche rein?
Ich hoffe du kannst mir da weiterhelfen.


----------



## ARadauer (23. Feb 2009)

ok nochmal von vorne... was willst du jetzt genau machen? Ist dir bewusst was du da machst?
Weißt du was hibernate und lucene sind?


----------



## TeamBob (24. Feb 2009)

Hi
Also Hibernate ist open-source-framework für java, indem man a Zuständen von Obejkten in einer relationalen Datenbank speichert und aus entsprechenden Datensätze wiederum Objekte erzeugen kann. So ungefähr grob erklährt. Lucene ist eine Java Open-source Bibliothek zum durchsuchen und erzeugen von Texten.

Also ich soll eine Schnittstelle zu einen Programm erstellen das über Webservice (SOAP) bereit gestellt werden soll.
Diese Webservice soll das durchsuchen von Mysql datenbanken nach Schlagwörtern ermöglichen und diese gefunden
Dokumente dann in einer Liste ausgeben, wo es möglich sein soll diese einzelnen dokumente dann zu öffnen.

Die Suchfunktion steht ja schon und auch der Client und der webservice ist soweit fertig und müsste bloss noch angepasst werden. Jedoch ist mir jetzt nicht ganz klar wie ich die Mysql datenbank durchsuchen soll und die dan als lise ausgeben soll. Ich habe bei Jboss schon eien MySql datei eingefügt die diese Sache ermöglichen soll.

MySql Datei


```
<?xml version="1.0" encoding="UTF-8" ?> 
- <!--  $Id: mysql-ds.xml 71535 2008-04-01 07:05:03Z adrian@jboss.org $ 
  --> 
- <!-- 
  Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html


  --> 
- <datasources>
- <local-tx-datasource>
  <jndi-name>jdbc/lsedemo</jndi-name> 
  <connection-url>jdbc:mysql://test-ts.systems.local:3306/lsedemo</connection-url> 
  <driver-class>com.mysql.jdbc.Driver</driver-class> 
  <user-name>test</user-name> 
  <password>test</password> 
  <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
- <!-- 
 should only be used on drivers after 3.22.1 with "ping" support
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
    

  --> 
- <!-- 
 sql to call when connection is created
    <new-connection-sql>some arbitrary sql</new-connection-sql>
      

  --> 
- <!-- 
 sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
    <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
      

  --> 
- <!--  corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) 
  --> 
- <metadata>
  <type-mapping>mySQL</type-mapping> 
  </metadata>
  </local-tx-datasource>
  </datasources>
```

Danke


----------



## ARadauer (24. Feb 2009)

ich habe leider noch nie mit lucene gearbeitet...
Was sind das für Document Objekte? In einer mysql werden keine dokuemente gespeichert, (höchstens irgendwelche files in form von blobs)...


----------



## TeamBob (24. Feb 2009)

Ja in mysql werden doch auch bibliotheken gespeichert und diese datenbank soll durchsucht werden


----------



## ARadauer (24. Feb 2009)

nein in einer datenbank werden keine bibliotheken gespeichert, was immer du mit bibliotheken meinst...


----------



## ARadauer (24. Feb 2009)

TeamBob hat gesagt.:


> Ich will das diese gefunden Dokumente als eine Liste zurückgegeben werden und
> man diese dann auswählen kann um sie zu öffnen.



Meist du mit Dokumente org.apache.lucene.document.Document Objekte? Ist das nicht eine Sammlung von Werten? das kann man nicht "öffnen"...

ich klink mich hier aus... das muss dir jemand helfen der mit lucene schon gearbeitet hat...


----------



## TeamBob (24. Feb 2009)

Hi
Also die Sache ist jetzt so weiter alles gelöst und ich habe das alles gemacht.
Jetzt habe ich an meiner Searchmethode gearbeitet und komme jetzt nicht weiter. Wenn ich jetzt das alles mit Jboss deploye dann zeigt er mit ein Fehler an. Ich schätze mal er kommt mit dem umwandeln der Dokumente in eine Arraylist in einer XML Sprache nicht klar oder so...

Fehler

```
ERROR [MainDeployer] Could not start deployment: file:/C:/Users/dnuss/Programme/jboss-4.2.3.GA/server/default/tmp/deploy/tmp1844kmm.ear-contents/kmm-ws.war
java.lang.IllegalStateException: Cannot build JAXB context
	at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.java:955)
	at org.jboss.ws.metadata.builder.jaxws.JAXWSWebServiceMetaDataBuilder.buildWebServiceMetaData(JAXWSWebServiceMetaDataBuilder.java:156)
	at org.jboss.ws.metadata.builder.jaxws.JAXWSServerMetaDataBuilder.setupProviderOrWebService(JAXWSServerMetaDataBuilder.java:52)
	at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilderJSE.buildMetaData(JAXWSMetaDataBuilderJSE.java:63)
	at org.jboss.wsf.stack.jbws.UnifiedMetaDataDeploymentAspect.create(UnifiedMetaDataDeploymentAspect.java:66)
	at org.jboss.wsf.framework.deployment.DeploymentAspectManagerImpl.deploy(DeploymentAspectManagerImpl.java:118)
	at org.jboss.wsf.container.jboss42.ArchiveDeployerHook.deploy(ArchiveDeployerHook.java:97)
	at org.jboss.wsf.container.jboss42.DeployerInterceptor.start(DeployerInterceptor.java:90)
	at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.start(SubDeployerInterceptorSupport.java:188)
	at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:95)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
......
......
......
```

Webservice


```
package web.service;


import java.util.List;

import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.naming.InitialContext;


import ejb.search.*;
import persistence.hibernate.entities.Document;



@WebService(name = "SearchService", serviceName = "SearchService", targetNamespace = "http://www.test.de")
@SOAPBinding(style = SOAPBinding.Style.RPC) ////Kommunikation über SOAP prozedurorientiert
public class WebServiceSearch {

@EJB
SearchLocal searchBean;

 SearchLocal getSearchBean() {

	if (searchBean == null) {
			
		try {
			searchBean = (SearchLocal) new InitialContext()
			.lookup("java:comp/env/ejb/SearchEJB");
			} catch (Exception a) {
				throw new RuntimeException(a);
			}
		}
		return searchBean;
	}	
 
 
//@WebMethod
 	//public java.util.ArrayList<String> getItems(java.lang.String searchTerm) {
   // new java.util.ArrayList<String>();
 
@WebMethod
public void createIndex ()
{ try {
	getSearchBean().createIndex();
} catch (Exception e) {
	e.printStackTrace();
}
}

@WebMethod
 	public Document[] searchInDocumentFieldsForSimpleSearch(final String and_search, final Long userId)
 		{
		List<Document> documents=
		getSearchBean().searchInDocumentFieldsForSimpleSearch(and_search, userId);
		return documents.toArray(new Document[documents.size()]);
 		}
}
```


Das hier ist die Dokument Klasse aber nur der Anfang weil die sehr lang ist...


```
@Entity
@Indexed(index = Item.INDEXNAME)
@Table(name = "DOCUMENT")
@PrimaryKeyJoinColumn(name = "itemid")
@OnDelete(action = OnDeleteAction.CASCADE)
public class Document extends Item {

	private static final long serialVersionUID = 4383112294280993163L;

	@Embeddable
	static public class NumberingFormat implements Serializable {

		private static final long serialVersionUID = -6523464405795614043L;

		private String format;

		private Integer sequenceId;

		@Column(name = "format", length = 100, nullable = true)
		public String getFormat() {
			return format;
		}

		public void setFormat(String format) {
			this.format = format;
		}

		@Column(name = "sequenceId", nullable = true)
		public Integer getSequenceId() {
			return sequenceId;
		}

		public void setSequenceId(Integer sequenceId) {
			this.sequenceId = sequenceId;
		}

	}

	private String name;
```


----------

