0

我有一个表,其中包含以下列:id、externalId、firstname、lastname、email

我的域名:

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 与我给它的匹配。我究竟做错了什么?

谢谢!

4

3 回答 3

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")

但这一切都非常冗长,您要验证它是否存在或返回具有该 id 的所有员工的列表?您将其称为 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()
}

是一些替代方法,并且可能在 db 上的强度较低,具体取决于您尝试实现的具体目标是布尔值与当前方法

我也打电话externalIdd,因为.where有时它的变量名与所谓的变量名相同会导致问题,因此改变

E2A 根据您的评论,如果您只需要 id 那么 id 通常是 Long 因此Long您可以使用的严格定义def- def 更通用并且会返回任何内容。我已经改进了仅包含属性的位置,id因此如果找到记录,它将返回 id,?:0L如果没有找到,则返回 0 LFor long 所以返回零 Long 您可以将其替换为?: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
    }
于 2016-12-19T16:47:19.243 回答
0

您应该调用findAllBy_()类,而不是实例。此外,由于您只返回一个Employee而不是列表,因此您应该使用findBy_(). 鉴于此,您的服务方法应如下所示:

def getEmployee(String externalId){
    return Employee.findByExternalId(exteranlId)
}
于 2016-12-19T20:55:25.727 回答
0

您不能拥有以 Id 结尾的属性。

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

而且我猜在动态查找器生成过程中存在问题导致这个 -

于 2016-12-20T07:46:11.353 回答