diff --git a/databind/src/main/java/tech/ydb/yoj/databind/converter/NotNullColumn.java b/databind/src/main/java/tech/ydb/yoj/databind/converter/NotNullColumn.java new file mode 100644 index 00000000..e9cc3814 --- /dev/null +++ b/databind/src/main/java/tech/ydb/yoj/databind/converter/NotNullColumn.java @@ -0,0 +1,22 @@ +package tech.ydb.yoj.databind.converter; + +import tech.ydb.yoj.databind.schema.Column; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.RECORD_COMPONENT; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Signifies that the column stored in the database does not accept {@code NULL} values. + * + * @see Column#notNull + */ +@Column(notNull = true) +@Target({FIELD, RECORD_COMPONENT, ANNOTATION_TYPE}) +@Retention(RUNTIME) +public @interface NotNullColumn { +} diff --git a/databind/src/main/java/tech/ydb/yoj/databind/schema/Column.java b/databind/src/main/java/tech/ydb/yoj/databind/schema/Column.java index c8dbe0c4..034291e9 100644 --- a/databind/src/main/java/tech/ydb/yoj/databind/schema/Column.java +++ b/databind/src/main/java/tech/ydb/yoj/databind/schema/Column.java @@ -58,6 +58,18 @@ */ String dbTypeQualifier() default ""; + /** + * Specifies whether only non-{@code NULL} values can be stored in this column. Defaults to {@code false} (allow {@code NULL} values).
+ * Note that this is orthogonal to Java nullness annotations, because YOJ uses {@code null} values for ID fields as a convention + * for "range over all possible values of this ID field" (see {@code Entity.Id.isPartial()}). + *

Tip: Use the {@link tech.ydb.yoj.databind.converter.NotNullColumn} annotation if you only need to overide + * {@code Column.notNull} to {@code true}. + * + * @see #149 + */ + @ExperimentalApi(issue = "https://github.com/ydb-platform/yoj-project/issues/149") + boolean notNull() default false; + /** * Determines whether the {@link FieldValueType#COMPOSITE composite field} will be: *