2016-12-19 18 views
0

У меня есть таблица со столбцами, как: ид, ExternalId, ПгвЬЫате, фамилия, адрес электронной почтыGrails findAllBy() не работает

Мой домен:

class Employee { 

int id 
String externalId 

static mapping = { 
    table "Employee" 

    id column: "Id" 
    externalId column: "externalId" 
    version false 
    }  
} 

Моя_служба:

class EmployeeService { 

def getEmployee(externalId) { 
    def employee = new Employee(); 

    employee.findAllByExternalId("1234"); 

    return employee 
} 

Сообщение об ошибке в журналах:

No signature of method Employee.findAllByExternalId is applicable for argument types (java.lang.String_ values: [1234] 

Моя цель - загрузить экземпляр Employee, где externalId соответствует тому, что я ему даю. Что я делаю не так?

Спасибо!

+1

'Int id' при запуске Grails запустить приложение, каждый домен будет автоматически создавать поле' id' & 'version' в базе данных, поэтому вы должны удалить эту строку 'int id' – akiong

ответ

1

Вы знаете, есть много плохого все это

//Create an instance of Employee which currently holds nothing 
def employee = new Employee(); 
//With this empty object of Employ now do findAllByExternalId 
    employee.findAllByExternalId("1234"); 

Вы должны смотреть вверх

//This will provide you with the entire employee 
// domain class any it finds with that externalId. 
// since it is declared as findAll 
// the return will naturally be a list even though there may only be 1 
def employees = Employee?.findAllByExternalId("1234") 

Но это все очень долго наматывается, что вы пытаетесь сделать, проверить его существует или возвращает список всех сотрудников, имеющих этот идентификатор? Вы ссылаетесь его к ней, как getEmployee, так что я полагаю, вы пытаетесь найти один, и все же вы ищете итерации, делая FindAll

// If you wanted just to check it exists return a boolean like this 
//This will return result as a boolean 
boolean getEmployee(externalIdd) { 
    return Employee.where { externalId == externalIdd }.exists() 
} 

//if you wanted purely employee entire object bound to first records 
Employee getEmployee(externalIdd) { 
    return Employee.where { externalId == externalIdd }?.find() 
} 

//if you wanted a list of entire employees like the findAll above 
List<Employee> getEmployee(externalIdd) { 
    return Employee.where { externalId == externalIdd }?.findAll() 
} 

некоторые альтернативные методы и возможно менее интенсивным по дб в зависимости от того, что вы пытаетесь достичь конкретно булевый против текущего метода

Также я назвал externalIdd так, когда речь идет о .where иногда имеющие одинаковые имена переменных, как то, что называется, следовательно, вызывает проблемы переделки

E2A В соответствии с вашим комментарием, если вам нужен только идентификатор, тогда идентификатор обычно длинный, поэтому строгое определение Long вы можете использовать def - def более общий и ничего не вернет. Я уточнил, где включить свойство только id, поэтому, если он найдет запись, он вернет id, а затем ?:0L, если ничего не найдено. 0 L В течение долгого времени, так что возвращайте ноль. Вы можете заменить его ?:null или вообще не объявлять.

//if you only want to get the id as per comment 
    Long getEmployeeId(String externalIdd) { 
     return (Employee.where{externalId == externalIdd}.property('id')?\ 
     .find()?:0L) 
     // Another way close to your findBy but manually declared 
     // and only returning id field. 
     // return Employee.find{externalId==externalIdd}?.id 
    } 
+0

Спасибо за ответ.Я пытаюсь получить значение столбца id, потянув работника за значение externalId. – gibsonsg

+0

Я оставил некоторые комментарии к блоку выше, они все такие методы, как ваши, но строго определены в отношении того, что они ожидают вернуть. Последний пример, приведенный в отредактированном примере, должен дать вам именно то, что вам нужно. – Vahid

0

Вы должны позвонить findAllBy_() на Класс, а не экземпляр. Кроме того, поскольку вы возвращаете только один Employee, а не список, вы должны использовать findBy_(). Учитывая, что ваш метод обслуживания должен выглядеть следующим образом:

def getEmployee(String externalId){ 
    return Employee.findByExternalId(exteranlId) 
} 
0

У вас не может быть объекта, оканчивающегося Id.

myInstance.propertyId means get the property "Property" and its Id. 

И я предполагаю, что проблема во время динамического FINDERS генерации причины this-