Grails перебирает таблицы базы данных - PullRequest
0 голосов
/ 01 октября 2010

Поскольку я немного новичок в Grails, мне интересно, как я могу перебирать текущие данные, которые я сохранил в базе данных, чтобы проверить, существует ли информация.

Например, допустим, у меня есть класс домена для книг, и я создаю действие, которое автоматически добавляет больше книг, но я хочу проверить, существует ли book.title, поэтому я не добавляю его снова.

Примечание Я просто использую базу данных по умолчанию (независимо от того, что используется, когда проект установлен в рабочий режим)


Редактировать

Я опубликую свои домены, чтобы их было легче понять. Вместо book.title я изменил его на то, где книга принадлежит автору. Поэтому я хочу, чтобы автор добавлялся один раз, но смог добавить много книг для него. Проблема возникает в действии, которое я создал в контроллере.

Авторский домен:

class Author {

    static hasMany = [books:Book]

    String authorName
    String notes
    String age

    String toString() { authorName }


    static constraints = {
        authorName()
        notes(maxSize:500)
        age()
    }
} 

Домен книги:

class Book {

    static belongsTo = Author

    String toString() { bookNumber }

    Author bookAuthor
    String title
    String numberOfPages


    static constraints = {
        bookAuthor()
        title()
        numberOfPages()
    }
}

Book Controller (вот где у меня проблемы):

class BookController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    //took out index, create, list, etc. to focus on the once that I'm concerned about


    //this action will simple read a text file and add books and authors
    def gather = {

        def parseData = new parseClient()        //parses text file line by line and puts it into a list  
        def dataHolder = parseData.information   //dataHolder will hold data from text file

        int linesOfData = dataHolder.size()      //get size to iterate and add authors & books

        linesOfData.times {
            def _author = dataHolder.author[it]  //get author - Author
            def _age = dataHolder.age[it]        //get age    - Author

            def _title = dataHolder.title[it]    //get title - Book
            def _pages = dataHolder.pages[it]    //get pages - Book

            def authorInstance                   //create new Author to add
            authorInstance = new Author()        //for some reason I have to create and save AuthorName (can't have other fields) before I can add my Book correctly
            authorInstance.setAuthorName(_author)
            authorInstance.save()

            def bookInstance
            bookInstance = new Book()           //create a new Book to add
            bookInstance.setBookAuthor(authorInstance)
            bookInstance.setTitle(_title)
            bookInstance.setNumberOfPages(_pages)
            bookInstance.save()                 //has to have access to the authorInstance to add correctly which is why i was wondering how to access the database to grab it if it existed

            authorInstance.setAge(_age)        //add whatever data is left for Author
            authorInstance.save()              //save again because cant save it with this information before I add authorInstance to the Book
        }

    }

}

Текстовое содержимое файла:

//You'll notice that author _Scott Davis_ is in here twice.
//I don't want to add two instances of Scott Davis but need to access it to add the book
//the unique constraint makes the value come up as not null but can't be added 

Scott Davis : Groovy Recipes
Bashar Abdul Jawad : Groovy and Grails Recipes
Fergal Dearle : Groovy for Domain-Specific Languages
Scott Davis : GIS for Web Developers: Adding 'Where' to Your Web Applications

Так что я в основном ищу способ добавить эту информацию и не нашел способа, который, кажется, работает без случайных проблем.

Надеюсь, это немного прояснит мой вопрос, так как первоначальный вопрос был немного широким

1 Ответ

3 голосов
/ 01 октября 2010

В этом случае вы можете наложить уникальное ограничение на заголовок, и Grails сделает это за вас.

Вы можете перебирать данные, но, возможно, не захотите загружать БД, если сможете этого избежать. Таким образом, вы можете написать собственный запрос, например, для выбора количества книг для заголовка.

Редактировать: для ваших обновлений

  1. Вам не нужно использовать сеттеры в вашем контроллере. Grails добавляет сеттеры / геттеры для вас динамически во время выполнения. Если вы хотите поместить некоторую логику в свои сеттеры, то вы можете определить свою собственную и использовать их в этом случае

  2. Вы смотрели документацию по Grails? http://grails.org/doc/latest/

у вас есть блок статических ограничений, но вы не определили, как вы хотите, чтобы каждое свойство было ограничено. для уникального названия это будет

 title(unique:true)

если вы хотите получить список имен авторов, вы можете сделать

List names = Author.executeQuery('select authorName from Author')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...