Почему при использовании HibernateCriteriaBuilder в Grails появляется сообщение об ошибке «Было присвоено нулевое значение свойству установщика примитивного типа»

Я получаю следующую ошибку при использовании атрибута примитива в моем объекте домена grails:

Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
 org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
71 голос | спросил Peter 1 J000000Thursday10 2010, 05:33:11

10 ответов


0

В соответствии с этим SO потоком , решение заключается в использовании непримитивных типов-обёрток; например, Integer вместо int.

ответил Peter 1 J000000Thursday10 2010, 05:33:59
0

Нулевое значение не может быть присвоено примитивному типу, например, int, long, boolean и т. д. Если столбец базы данных, соответствующий полю в вашем объекте, может быть нулевым, то ваше поле должно быть классом-оболочкой, например Integer , Long, Boolean и т. Д.

Опасность заключается в том, что ваш код будет работать нормально, если в БД нет нулей, но завершится ошибкой после вставки нулей.

И вы всегда можете вернуть примитивный тип из геттера. Пример:

  private Integer num;

  public void setNum(Integer i) {
    this.num = i;
  }

  public int getNum() {
    return this.num;
  }

Но в большинстве случаев вы захотите вернуть класс-оболочку.

Так что либо установите в столбце БД недопустимые значения, либо используйте класс-оболочку.

ответил MattC 17 MonEurope/Moscow2012-12-17T04:03:35+04:00Europe/Moscow12bEurope/MoscowMon, 17 Dec 2012 04:03:35 +0400 2012, 04:03:35
0

Примитивный тип не может быть нулевым. Таким образом, решение состоит в том, чтобы заменить примитивный тип классом-оболочкой в ​​вашем файле tableName.java. Например:

@Column(nullable=true, name="client_os_id")
private Integer client_os_id;

public int getClient_os_id() {
    return client_os_id;
}

public void setClient_os_id(int clientOsId) {
    client_os_id = clientOsId;
}

ссылка http://en.wikipedia.org/wiki/Primitive_wrapper_class , чтобы найти класс-оболочку примитивного типа.

ответил Nhat Dinh 22 Jam1000000amTue, 22 Jan 2013 07:48:31 +040013 2013, 07:48:31
0

используйте Integer в качестве типа и предоставьте соответственно метод set /getter.

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...
ответил arn-arn 5 ThuEurope/Moscow2013-12-05T01:55:20+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 01:55:20 +0400 2013, 01:55:20
0

Я постараюсь, чтобы вы поняли с помощью примера. Предположим, у вас была реляционная таблица (STUDENT) с двумя столбцами и ID (int) и NAME (String). Теперь, как ORM, вы бы сделали класс сущности примерно следующим образом: -

package com.kashyap.default;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author vaibhav.kashyap
 *
 */
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -1354919370115428781L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "NAME")
    private String name;

    public Student(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Предположим, что в таблице уже есть записи. Теперь, если кто-то попросит вас добавить еще один столбец «ВОЗРАСТ» (int)

  

ALTER TABLE STUDENT ADD AGE int NULL

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

@Column(name = "AGE")
private int age;

или

@Column(name = "AGE")
private INTEGER age;

вам нужно будет объявить поле как не примитивный тип данных обертки, потому что контейнер попытается сопоставить таблицу с сущностью. Следовательно, он не сможет отобразить значения NULL (по умолчанию), если вы не объявите поле как оболочку & в конечном итоге выдает «Нулевое значение было присвоено свойству установщика примитивного типа» Exception.

ответил codechefvaibhavkashyap 11 J0000006Europe/Moscow 2016, 20:53:43
0

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

public void setClient_os_id(Integer clientOsId) {
client_os_id = clientOsId;
}
ответил Kamiel Ahmadpour 20 J000000Sunday14 2014, 13:41:45
0

Либо полностью избегайте null в БД через NOT NULL и в сущности Hibernate через @Column(nullable = false) соответственно или используйте Long обертка вместо вас long примитивы.

Примитив не является объектом, поэтому вы не можете присвоить ему null.

ответил Andrew 31 MarpmThu, 31 Mar 2016 16:34:46 +03002016-03-31T16:34:46+03:0004 2016, 16:34:46
0

Измените тип параметра с простого на Object и установите нулевую проверку в установщике. Смотрите пример ниже

public void setPhoneNumber(Long phoneNumber) {
    if (phoneNumber != null)
        this.phoneNumber = phoneNumber;
    else
        this.extension = 0l;
}
ответил Sandeep Shankar Harikrishnan 17 J000000Sunday16 2016, 01:54:50
0

Убедитесь, что поле myAttribute в вашей базе данных содержит ноль вместо нуля.

ответил Aravinthan K 16 PMpThu, 16 Apr 2015 14:28:58 +030028Thursday 2015, 14:28:58
0

Есть два пути

  • Убедитесь, что столбец БД не разрешен. null
  • Классы пользовательских оболочек для переменной типа примитива, такие как private int var;, могут быть инициализированы как private Integer var;
ответил 4302836 31 AM00000090000000831 2018, 09:55:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132