Skip to content

License

Annotation Reference

Entity Annotations

@QfEntity

Declares a class as a Q-Framework entity. Placed on the domain entity class.

java
@QfEntity(
    appKey = "app",
    name = @QfI18n(
        defaultMessage = "Product",
        texts = { @QfI18nText(locale = "ko", message = "상품") }
    ),
    autoHistoryEnabled = false,
    deletePolicy = @QfCrudPolicy(enabled = true),
    capabilityKey = "product-management"
)
public class ProductEntity { }
AttributeTypeDescriptionDefault
appKeyStringOwning client app key"" (uses declared app)
name@QfI18nLocalized display name@QfI18n(texts = {})
autoHistoryEnabledbooleanEnable automatic change historyfalse
deletePolicy@QfCrudPolicyDelete operation policy@QfCrudPolicy(enabled = false)
treePolicy@QfTreePolicyTree/hierarchical structure config@QfTreePolicy (disabled)
ownerPolicy@QfOwnerPolicyOwnership and visibility policy (org or user)@QfOwnerPolicy(enabled = false)
masterRelation@QfMasterRelationMaster-detail relationship@QfMasterRelation(enabled = false)
capabilityKeyStringLinked capability key"" (derived from class name)
excelDownloadablebooleanEnable Excel export endpointtrue
excelUploadablebooleanEnable Excel import endpointtrue
displayTextRules@QfComposedText[]Rules for composing display text from multiple fields{}
requireSearchTriggerbooleanRequire explicit search action before loading datafalse
hideRowNumberbooleanHide the row number columnfalse
autoSelectSingleResultbooleanAutomatically select when query returns exactly one resultfalse
forceRowSelectionbooleanRequire row selection before entity-level actionsfalse
masterEntityDependentModeQfMasterEntityDependentModeDEPENDENT: framework validates that a master entity exists as a structural reference of this entity type. INDEPENDENT: no such validation.DEPENDENT
buttons@QfButton[]Entity-level action buttons{}
exposeOn@QfExposeOn[]App/capability exposure rules{}
managementConditions@QfConditionExpr[]Additional conditions applied to the management view{}
excludedApiTypesQfGeneratedApiTypeEnum[]API endpoint types to exclude from code generation{}
apiGenerationGroupQfGeneratedApiTypeGroupEnumAPI generation groupall

QfGeneratedApiTypeEnum values

ValueDescription
createCreate a new entity record
listPaged/filtered list of records
detailSingle record by key/conditions
load_updateLoad initial data for update screens
updateModify an existing record
deleteRemove a record (soft or hard depending on policy)
historiesChange history / audit records
uniqueCheck uniqueness of an attribute value
orderUpdate ordering/sort sequence
treeHierarchical entity data as a tree
key_valueSimplified key-value dataset (selectors, code tables)
update_key_valueUpdate key-value style configuration records
excel_createRegister an Excel upload/download job
excel_processParse/validate/apply uploaded Excel data
excel_downloadExport data to an Excel file
excel_sample_downloadDownload an Excel template for upload
excel_download_pollPoll asynchronous Excel download progress
excel_download_cancelCancel an asynchronous Excel download job
excel_process_pollPoll asynchronous Excel processing progress
excel_process_cancelCancel an asynchronous Excel processing job
excel_download_resultReturn downloadable result once a job finishes
asyncsearchRun a potentially slow search as an asynchronous job

QfGeneratedApiTypeGroupEnum values

ValueGenerated APIsDescription
allAll typesGenerate all supported API types (no exclusions)
only_crudCRUD + query APIsExcludes Excel workflow APIs and asyncsearch
excelExcel workflow APIsExcludes general CRUD/query and other non-Excel utilities
only_readlist, detailGenerates list and detail only
only_listlistGenerates list only

@QfClientApp

Declares a client application. Placed on a configuration class.

java
@QfClientApp(
    key = "app",
    name = @QfI18n(
        defaultMessage = "App",
        texts = { @QfI18nText(locale = "ko", message = "일반 앱") }
    )
)
public class AppConfig { }
AttributeTypeRequiredDescription
keyStringUnique client app key
name@QfI18nLocalized display name
descriptionStringBrief description of the app
orderintDisplay order hint (lower = first)

Capability / Permission Annotations

@QfCapability

Declares a business function area (Capability). Placed on a dedicated class.

java
@QfCapability(
    key = "product-management",
    name = @QfI18n(defaultMessage = "Product Management", texts = {}),
    entities = { ProductEntity.class },
    privileges = {
        @QfPrivilege(key = "product-management__create"),
        @QfPrivilege(key = "product-management__delete")
    }
)
public final class ProductManagementCapability { }
AttributeTypeRequiredDescription
keyStringUnique capability key
name@QfI18nLocalized display name
entitiesClass[]Primary managed entity classes
privileges@QfPrivilege[]Privileges defined by this capability

Entities are linked to a capability via @QfEntity(capabilityKey = "..."), not by placing @QfCapability on the entity class.


@QfPrivilege

Declares a permission unit within a @QfCapability.

java
@QfPrivilege(
    key = "product-management__create",
    name = @QfI18n(defaultMessage = "Create Product", texts = {})
)
AttributeTypeRequiredDescription
keyStringUnique key (scoped within Capability)
name@QfI18nLocalized display name

Security Annotations

@QfCrypto

Automatically encrypts and decrypts a field. Placed on a field.

java
@QfCrypto
private String email;

@QfCrypto(algorithm = QfCrypto.CryptoAlgorithm.bcrypt)
private String password;

Restriction

Cannot be combined with @QfSearch (compile error).

AttributeTypeDescriptionDefault
algorithmCryptoAlgorithmPersistence algorithmaes256

CryptoAlgorithm values

ValueDirectionDescription
aes256Symmetric (reversible)AES-256 encryption
sha256One-waySHA-256 hash
pbkdf2One-wayPBKDF2 key derivation
bcryptOne-wayBCrypt password hash
argon2One-wayArgon2 password hash / KDF
rsaCipherAsymmetric (reversible)RSA encryption
rsaKeyRSA key material storage
rsaSignatureRSA signature

@QfOwnerPolicy (element)

Declares the data ownership and visibility policy for an entity. Supports two ownership models:

  • ORGANIZATION — data is owned by an organization; filtered by org hierarchy traversal
  • USER — data is owned by a user; filtered by principalId equality

Used as an element inside @QfEntity:

java
// Organization ownership — own org only (default)
@QfEntity(
    ownerPolicy = @QfOwnerPolicy(enabled = true, attribute = "orgId")
)

// Organization ownership — own org + all descendants
@QfEntity(
    ownerPolicy = @QfOwnerPolicy(
        enabled = true,
        attribute = "orgId",
        include = QfOrganizationInclude.ANCHOR_AND_DESCENDANTS
    )
)

// User ownership — only the creator can see their own data
@QfEntity(
    ownerPolicy = @QfOwnerPolicy(
        enabled = true,
        ownerType = QfOwnerType.USER,
        attribute = "createdBy"
    )
)
AttributeTypeDescriptionDefault
enabledbooleanEnable ownership filteringtrue
ownerTypeQfOwnerTypeORGANIZATION or USERORGANIZATION
attributeStringField name holding the owner ID""
anchorKindQfOrganizationAnchorKindAnchor strategy (ORGANIZATION only)SELF
anchorDepthintAnchor depth (ORGANIZATION only)0
includeQfOrganizationIncludeTraversal direction (ORGANIZATION only)ANCHOR_ONLY
maxAncestorDepthintMax ancestor levels, -1 = unlimited-1
maxDescendantDepthintMax descendant levels, -1 = unlimited-1
overrideModeQfOrganizationPolicyOverrideModeGlobal policy override behaviorREPLACE

QfOrganizationAnchorKind values

ValueDescription
ROOTUse the root (top-most) organization as the anchor
SELFUse the current organization as the anchor (default)
ANCESTOR_RELATIVE_DEPTHUse the ancestor at the given relative depth (0 = self, 1 = parent, …)
ANCESTOR_ABSOLUTE_DEPTHUse the ancestor whose absolute depth from root matches anchorDepth

QfOrganizationInclude values

ValueDescription
ANCHOR_ONLYInclude only the anchor organization (default)
ANCHOR_AND_DESCENDANTSInclude anchor and all descendant organizations
ANCHOR_AND_ANCESTORSInclude anchor and all ancestor organizations
ANCHOR_AND_ANCESTORS_AND_DESCENDANTSInclude anchor, all ancestors, and all descendants
CUSTOMCustom traversal strategy (application-defined)

QfOrganizationPolicyOverrideMode values

ValueDescription
REPLACEEntity policy completely replaces the global policy (default)
RESTRICTEntity policy may only narrow the global policy (prevents accidental privilege widening)

Validation Annotations

@QfValidationRule

Declares a validation rule on a field. Repeatable.

java
@QfValidationRule(
    rule = QfValidationRule.Rule.regex,
    params = {"^[A-Za-z0-9_]+$"},
    invalidValueMessageKey = "validation.loginId.invalid"
)
private String loginId;
AttributeTypeRequiredDescription
ruleRuleValidation rule type
paramsString[]Rule parameters (pattern for regex)
invalidValueMessageKeyStringError message resource key (mutually exclusive with invalidValueMessages)
invalidValueMessages@QfI18nInline error message (mutually exclusive with invalidValueMessageKey)
serverOnlybooleanServer-side only validation
applyOn@QfConditionExpr[]Conditions for rule application
references@QfValidationRuleReference[]Cross-attribute references for validation (e.g., password confirmation, date comparison)

Mutually exclusive

invalidValueMessageKey and invalidValueMessages are mutually exclusive. Use invalidValueMessageKey when the message is defined in a message resource file, and invalidValueMessages for inline messages.

Rule enum values:

RuleDescriptionparams
regexCustom regexparams[0] = pattern
uniqueServer uniqueness checkparams[0] = URL (optional)
login_idLogin ID format (from config)
user_pwdPassword policy (from config)

Display Annotations

@QfListAttribute

Displays as a column in the list view.

java
@QfListAttribute(sortable = true)
private String name;
AttributeTypeDefaultDescription
sortablebooleanfalseWhether sortable
cannotHidebooleanfalsePrevent user from hiding column
orderint0Column display order (lower = earlier)
uiClasses@QfUiClasses[]{}UI class definitions for this column
subattributesSubattribute[]{}Sub-lines from an entity-typed attribute
showOn@QfConditionExpr[]{}Conditional visibility expressions
buttons@QfButton[]{}Row-level action buttons
exposeOn@QfExposeOn[]{}App/capability visibility rules

@QfListAttribute.Subattribute inner annotation

Used inside subattributes to declare which inner attributes of an entity-typed field should be rendered as sub-lines in the list cell.

java
@QfListAttribute(
    subattributes = {
        @QfListAttribute.Subattribute(attributeName = "code"),
        @QfListAttribute.Subattribute(attributeName = "name")
    }
)
private CategoryEntity category;
AttributeTypeDescriptionDefault
attributeNameStringInner attribute name to render(required)
name@QfI18nLocalized subattribute label@QfI18n(texts = {})
displayTextRules@QfComposedText[]Rules for composing display text{}
controlTypeQfControlType.TypeRendering control typetext

@QfDetailAttribute

Displays in the detail view.

java
@QfDetailAttribute
private String name;
AttributeTypeDescriptionDefault
uiClasses@QfUiClasses[]UI class definitions{}
exposeOn@QfExposeOn[]App/capability visibility rules{}
showOn@QfConditionExpr[]Visibility conditions{}
orderintDisplay order (lower = earlier)0

@QfCreateAttribute

Displays as an input field in the create form.

java
@QfCreateAttribute(
    requiredOn = @QfRequiredOn(always = true)
)
private String name;
AttributeTypeDescriptionDefault
exposeOn@QfExposeOn[]App/capability visibility rules{}
requiredOn@QfRequiredOnRequired rule@QfRequiredOn
readonlyOn@QfReadonlyOnRead-only rule@QfReadonlyOn
initialValueStringStatic initial value""
dynamicInitialValue@QfComposedText[]Dynamic initial value (takes precedence over initialValue){}
uiClasses@QfUiClasses[]UI class definitions{}
showOn@QfConditionExpr[]Visibility conditions{}
disableOn@QfConditionExpr[]Disable conditions{}
syncValueFromStringCopy value from another attribute path""
initialValuesInitialValue[]Nested initial values for entity-type attributes{}
setValuesFromString[]Attribute names whose last-entered values carry forward as defaults{}

@QfUpdateAttribute

Displays as an input field in the update form.

java
@QfUpdateAttribute(
    requiredOn = @QfRequiredOn(always = true)
)
private String name;
AttributeTypeDescriptionDefault
exposeOn@QfExposeOn[]App/capability visibility rules{}
requiredOn@QfRequiredOnRequired rule@QfRequiredOn
readonlyOn@QfReadonlyOnRead-only rule@QfReadonlyOn
uiClasses@QfUiClasses[]UI class definitions{}
showOn@QfConditionExpr[]Visibility conditions{}
disableOn@QfConditionExpr[]Disable conditions{}
syncValueFromStringCopy value from another attribute path""
orderintColumn display order (lower = earlier)0

TIP

@QfUpdateAttribute does not have initialValue / dynamicInitialValue parameters — those are specific to @QfCreateAttribute.


@QfSearch

Enables the field as a search filter in the list view.

java
@QfSearch(type = QfSearch.Type.text)
private String name;

@QfSearch(type = QfSearch.Type.select)
private String status;
AttributeTypeDescriptionDefault
typeTypeSearch control typeauto
exposeOn@QfExposeOn[]App/capability visibility rules{}
showOn@QfConditionExpr[]Visibility conditions{}
caseSensitiveCaseSensitiveCase sensitivity (sensitive/insensitive)insensitive
conditionConditionMatch condition (like/exact)like
conditions@QfConditionExpr[]Additional conditions applied to option/search data{}
targetStringAssociation path to the effective search target (e.g. "invcNo.hdry")""
multipleQfControlType.MultipleValueMulti-value policyunset

Type enum values

TypeDescription
autoAuto-detect based on field type
textPlain text input
selectSingle-select dropdown
true_or_falseBoolean toggle
multiselectMulti-select
period_dateDate range
period_datetimeDatetime range

Auto-resolution rules (type = auto)

  • Primitive / wrapper / Stringtext
  • String + @QfCodeGroupselect
  • User-defined class → select

When resolved to select, caseSensitive is forced to sensitive and condition is forced to exact.


@QfOptions

Declares option metadata for choice-based controls (select, multiselect, radio, etc.).

By default, for code-based or entity-typed attributes, options are resolved automatically. Use @QfOptions to override the default resolution, apply additional conditions, or define fully manual options.

java
@QfOptions(
    conditions = {
        @QfConditionExpr({
            @QfCondToken(type = QfCondTokenType.ATOM,
                atom = @QfCondition(attributeName = "alias", notIn = {"user_status.system"}))
        })
    }
)
private UserStatus status;
AttributeTypeDescriptionDefault
conditions@QfConditionExpr[]Conditions for filtering option candidates{}
optionModel@QfOptionModelExplicit option model (entity or code group)@QfOptionModel
nameStringAttribute on the relation model that references the current entity""
referencedAttributeNameStringAttribute on the current entity that joins to the relation model key""
searchAttributeNameStringTarget attribute in the relation model used as the search attribute""
displayTextRules@QfComposedText[]Rules for composing option labels{}
asyncSearch@QfAsyncSearchAsync search configuration (for large or dynamic option sets)@QfAsyncSearch
customOptions@QfCustomOption[]Fully manual option list (takes precedence over all other settings when non-empty){}

Custom options take full precedence

When customOptions is non-empty, all other @QfOptions settings (conditions, optionModel, asyncSearch, etc.) are ignored.

@QfOptionModel parameters

AttributeTypeDescriptionDefault
codeGroupStringCode group identifier when the option model is backed by a code table""
conditionStringAdditional filter condition for option lookup (e.g., JPQL fragment)""

@QfAsyncSearch parameters

AttributeTypeDescriptionDefault
watchStringAttribute to watch; if empty, uses the current attribute's typed input""
targetString[]Attribute names in the option model to search/match against{}
urlStringCustom API endpoint for async option resolution""

@QfCustomOption parameters

AttributeTypeDescriptionDefault
names@QfI18nLocalized display name of the option(required)
valueStringActual option value to submit/store(required)

@QfComposedText (element)

Declares display text composition rules. Repeatable — multiple @QfComposedText entries are processed in declaration order.

AttributeTypeDescriptionDefault
segments@QfTextSegment[]Parts used to compose the display text, concatenated in order(required)
useI18nbooleanIf true, treats the composed string as a message key and resolves it via i18n lookupfalse

@QfCrudPolicy (element)

Declares a CRUD operation policy. Used as an element inside @QfEntity (e.g., deletePolicy = @QfCrudPolicy(...)).

AttributeTypeDescriptionDefault
enabledbooleanWhether the operation is enabledtrue
forbiddenTooltipStringTooltip message key shown when the operation is forbidden""
conditions@QfConditionExpr[]Conditional constraints evaluated against runtime context{}

@QfControlType

Declares the UI control type for a field.

java
@QfControlType(QfControlType.Type.email)
private String email;

@QfControlType(QfControlType.Type.textarea)
private String description;

@QfControlType(value = QfControlType.Type.number, minValue = 0, maxValue = 100)
private Integer score;
AttributeTypeDescriptionDefault
valueTypeControl type(required)
hint@QfI18nPlaceholder / help text@QfI18n(texts = {})
multipleMultipleValueMulti-value policy (multiple/single/unset)unset
regexStringRegex for random_string type""
minValuelongMinimum value (number type)Long.MIN_VALUE
maxValuelongMaximum value (number type)Long.MAX_VALUE
uniqueOnStringUniqueness key attribute within section_list""
passwordConfirmbooleanRequest confirmation input (password type)false

Type enum values

ValueDescription
textPlain text input
displayDisplay-only (read-only)
random_stringAuto-generated random string (uses regex)
passwordPassword input
textareaMulti-line text area
html_editorRich text (HTML) editor
selectSingle-select
multiselectMulti-select
fileFile upload
numberNumeric input
i18nInternationalized text
weekdaySingle weekday selection
weekdaysMultiple weekday selection
iconIcon selector
dateDate picker
timeTime picker
datetimeDatetime picker
date_simple_stringDate as plain string (e.g. yyyyMMdd)
time_simple_stringTime as plain string (e.g. HHmm)
telTelephone number
emailEmail address
pointCoordinates (lat/lng)
zipPostal code
checkboxCheckbox
sectionLayout section separator
section_listRepeatable section list
mapMap / location control
radioRadio button group
paintDrawing area
hiddenHidden field (has value, not displayed)

Button Annotations

@QfButton

Declares a button rendered inside a list column or entity toolbar. Used as element of @QfListAttribute(buttons = ...) or @QfEntity(buttons = ...).

java
@QfListAttribute(
    buttons = {
        @QfButton(
            frontendComponent = "ProductDetailModal",
            name = @QfI18n(defaultMessage = "Detail"),
            icon = "cilInfo",
            color = "primary",
            size = "xl"
        )
    }
)
AttributeTypeDescriptionDefault
frontendComponentStringFrontend component rendered inside the modal(required)
name@QfI18nLocalized button label@QfI18n(defaultMessage = "button", texts = {})
iconStringIcon identifier (CoreUI)""
colorStringButton color (CoreUI)"secondary"
sizeStringModal size (sm / lg / xl / full)"xl"
actionTypeActionTypeClick action type (MODAL / NONE)MODAL
enabledOnCheckedbooleanEnable only when at least one row is checkedfalse
modalCloseOnlybooleanModal shows only a close button (no confirm)false
inputsInput[]Input fields rendered inside the modal{}
conditions@QfConditionExpr[]Visibility conditions for the button{}
displayTextRules@QfComposedText[]Rules for composing display text{}

@QfButton.Input parameters

AttributeTypeDescriptionDefault
keyStringInput parameter identifier(required)
typeStringInput type (e.g. text, number)(required)
placeholder@QfI18nLocalized placeholder text@QfI18n(texts = {})

Structural Annotations

@QfMasterRelation (element)

Declares a master-detail relationship. Used as an element inside @QfEntity:

java
@QfEntity(
    masterRelation = @QfMasterRelation(
        enabled = true,
        masterEntityFqcn = "com.example.OrderEntity",
        masterKeyAttribute = "orderId",
        onMasterDelete = QfMasterRelation.OnMasterDelete.CASCADE_DELETE
    )
)
public class OrderItemEntity { }
AttributeTypeDescriptionDefault
enabledbooleanEnable the master relationfalse
masterEntityFqcnStringFully-qualified class name of the master entity""
masterKeyAttributeStringAttribute on this entity that holds the master's ID""
onMasterDeleteOnMasterDeleteCascade policy when master is deletedIGNORE
onMasterDeleteDescription
CASCADE_DELETEDelete details when master is deleted
RESTRICTReject master deletion if details exist
IGNORELeave details orphaned

@QfTreePolicy (element)

Declares tree behavior policy. Used as an element inside @QfEntity:

java
@QfEntity(
    treePolicy = @QfTreePolicy(editableRoot = true, draggable = false)
)
public class CategoryEntity { }
AttributeTypeDescriptionDefault
editableRootbooleanWhether the root node of the current tree view is editablefalse
draggablebooleanEnable drag-and-drop reorderingtrue

@QfParent / @QfTreeDepth / @QfChildren

Declare tree structure fields.

java
@QfParent
private String parentId;

@QfTreeDepth
private Integer depth;

@QfChildren
private List<CategoryEntity> children;

@QfParent parameters

AttributeTypeDescriptionDefault
defaultValueStringSentinel value representing a root node (no parent)""
defaultNullbooleanWhether root nodes use null as the parent valuefalse

@QfTreeDepth parameters

AttributeTypeDescriptionDefault
defaultValueintDefault depth value (1 = root)1

@QfGroup

Groups related fields together in the UI.

java
@QfGroup(alias = "address_info")
private String address;

@QfGroup(alias = "address_info")
private String zipCode;
AttributeTypeDescriptionDefault
aliasStringGroup identifier (stable key for templates and UI rendering)(required)
name@QfI18nLocalized group label@QfI18n(defaultMessage = "group", texts = {})
uiClasses@QfUiClasses[]UI class definitions applied to the group{}

Lifecycle Hook Annotations

@QfOn

Declares a hook method to be called at a specific point in the CRUD pipeline. Repeatable.

java
@QfOn(phase = QfOnPhase.BEFORE, op = QfOnOp.CREATE)
public void beforeCreate(QfPipelineContext ctx) { ... }

@QfOn(phase = QfOnPhase.AFTER, op = QfOnOp.UPDATE, when = QfOnWhen.SUCCESS)
public void afterUpdate(QfPipelineContext ctx) { ... }
AttributeTypeDescriptionDefault
phaseQfOnPhaseExecution phase(required)
opQfOnOpTarget operation(required)
layerQfOnLayerExecution layerDOMAIN
ioQfOnIoI/O typeNONE
scopeQfOnScopeData scopeSINGLE
whenQfOnWhenExecution condition (AFTER phase)ALWAYS
orderintExecution order among hooks at the same point0

QfOnPhase

ValueDescription
BEFOREExecuted before the operation
AFTERExecuted after the operation

QfOnOp

ValueDescription
CREATECreate operation
READRead (single record)
UPDATEUpdate operation
DELETEDelete operation
LISTList/query operation
DETAILDetail view
TREETree query
EXPORTData export (Excel/CSV)
IMPORTData import (Excel/CSV)
SEARCHSearch/filter
UNIQUE_SEARCHUniqueness check search
MASTER_ENTITYMaster entity lookup

QfOnLayer

ValueDescription
REQUESTRequest boundary (before/after API endpoint)
DOMAINDomain/service processing (default)
COMMITAfter transaction commit

QfOnScope

ValueDescription
SINGLESingle record (default)
LISTCollection of records
BULKBulk operation

QfOnWhen (meaningful in AFTER phase)

ValueDescription
ALWAYSAlways execute (default)
SUCCESSOnly on successful execution
FAILUREOnly on failed execution

QfOnIo

ValueDescription
NONENo special I/O (default)
EXCELExcel import/export
CSVCSV import/export

Audit Trail Annotations

Auto-populated by the framework at write time:

AnnotationDescription
@QfRgsOperIdRecords the creator's user ID
@QfRgsOperDtRecords the creation timestamp
@QfRgsOperIpRecords the creator's IP address
@QfUpdtOperIdRecords the last updater's user ID
@QfUpdtOperDtRecords the last update timestamp
@QfUpdtOperIpRecords the updater's IP address
@QfDeleteOperIdRecords the deleter's user ID
@QfDeleteOperDtRecords the deletion timestamp
@QfDeleteOperIpRecords the deleter's IP address
@QfDeleteFlagMarks the record as soft-deleted

@QfDeleteFlag parameters

AttributeTypeDescriptionDefault
deletedValuesString[]Values that represent the deleted state (e.g. {"Y"}, {"1"}, {"true"}){}
valueTypeQfDeleteValueTypeForces the comparison type for the flag valueAUTO
valueTypeDescription
AUTOAuto-detect based on attribute type
STRINGString-based comparison
BOOLEANBoolean-based comparison
INTEGERInteger-based comparison
LONGLong-based comparison

Result Code Annotations

@QfResultCode

Declares a result code. Placed on a type.

java
@QfResultCode(
    code = "Q-MY-APP-000001",
    messageKey = "result_code.text.q_my_app_000001",
    cause = "Product not found",
    resolution = "Check the product ID and retry.",
    target = "Product"
)
public interface ProductResultCode { }
AttributeTypeDescriptionDefault
codeStringGlobally unique result code (e.g. Q-MY-APP-000001)(required)
causeStringShort developer-facing description of the cause(required)
resolutionStringActionable guidance to resolve or handle the situation(required)
targetStringPrimary applicable target (module/component/handler)(required)
messageKeyStringMessage resource key (auto-generated if empty)""

For details, see the Result Code Reference.


Internationalization Annotations

@QfI18n

Declares a localized message bundle. Used as an element inside other annotations.

java
@QfI18n(
    defaultMessage = "Product Name",
    texts = {
        @QfI18nText(locale = "ko", message = "상품명"),
        @QfI18nText(locale = "ja", message = "商品名")
    },
    key = "entity.product.name.label",   // optional; auto-generated if empty
    sync = false
)
AttributeTypeDefaultDescription
defaultMessageString""Fallback text when no locale matches
texts@QfI18nText[]{}Locale-specific messages
keyString""Message lookup key (auto-generated if empty)
syncbooleanfalseSync with source on every startup

@QfI18nText

One locale-specific message within a @QfI18n bundle.

java
@QfI18nText(locale = "ko", message = "상품명")
AttributeTypeDescriptionDefault
localeStringLocale identifier (e.g. ko, en)(required)
messageStringLocalized message text(required)
syncbooleanForce-sync this locale entry on every startupfalse

Enum Reference

QfMenuDisplayLocationEnum

Defines where a menu item is rendered in the client UI. Used by the framework to normalize menu placement across different frontend implementations.

ValueDescription
mainPrimary navigation area
topTop / header bar
bottomBottom / footer bar
leftSecondary left-side area
rightSecondary right-side area

@QfDisplayHint

Declares a hint (tooltip / placeholder) for a field.

java
@QfDisplayHint(text = "Enter the product name")
private String name;

@QfDisplayHint(key = "hint.product.name")   // resolved from message resource
private String name;
AttributeTypeDescriptionDefault
keyStringMessage resource key for i18n resolution""
textStringLiteral hint text (fallback when key is not set or cannot be resolved)""

Sorting & Data Annotations

@QfOrder

Marks an attribute as the default sort key for list queries.

java
@QfOrder(direction = QfOrder.Direction.desc)
private LocalDateTime createdAt;
AttributeTypeDescriptionDefault
directionDirectionSort directionasc

Direction values: asc, desc


@QfSeparator

Declares a custom delimiter for serializing collection-type attributes.

java
@QfSeparator("|")
private List<String> tags;
AttributeTypeDescriptionDefault
valueStringDelimiter used to join collection elements(required)

@QfCodeGroup

Marks an attribute as a code-based attribute resolved from a code table.

java
@QfCodeGroup(alias = "STATUS_CODE")
private String status;
AttributeTypeDescriptionDefault
aliasStringCode group identifier(required)

Structural Data Annotations

@QfEmbeddedId

Marks an attribute as a composite/embedded identifier. No parameters.

java
@QfEmbeddedId
private OrderId id;

@QfMap

Declares a virtual map (location) attribute rendered as a map widget. The actual data is stored in separate address/coordinate attributes.

java
@QfMap(
    addressAttributeName = "address",
    latitudeAttributeName = "lat",
    longitudeAttributeName = "lng"
)
private Object location;
AttributeTypeDescriptionDefault
addressAttributeNameStringAttribute name that stores the address(required)
latitudeAttributeNameStringAttribute name that stores the latitude(required)
longitudeAttributeNameStringAttribute name that stores the longitude(required)

Conditional Behavior Annotations

@QfForceTransfer

Forces an attribute to always be included in the transfer payload, even if it is not exposed as a list/create/update/detail attribute.

java
@QfForceTransfer
private String internalCode;
AttributeTypeDescriptionDefault
exposeOn@QfExposeOn[]Per-app/capability exposure rules{}
conditions@QfConditionExpr[]Conditions under which force-transfer applies{}

@QfRequiredOn (element)

Declares when an attribute is required. Used as a nested element in @QfCreateAttribute / @QfUpdateAttribute.

AttributeTypeDescriptionDefault
alwaysbooleanAlways required (conditions must be empty)false
conditions@QfConditionExpr[]Conditions that make the attribute required{}

@QfReadonlyOn (element)

Declares when an attribute is read-only. Used as a nested element in @QfCreateAttribute / @QfUpdateAttribute.

AttributeTypeDescriptionDefault
alwaysbooleanAlways read-only (conditions must be empty)false
conditions@QfConditionExpr[]Conditions that make the attribute read-only{}

@QfExposeOn (element)

Declares per-app/capability visibility rules. Used as a nested element in attribute annotations.

AttributeTypeDescriptionDefault
appKeysString[]Client app keys where this element is exposed (empty = all apps){}
capabilitiesString[]Capability aliases where this element is exposed (empty = all capabilities){}

@QfUiClasses

Declares UI class names applied to an attribute, with optional conditions. Repeatable.

java
@QfUiClasses(value = {"text-danger", "fw-bold"})
private String status;
AttributeTypeDescriptionDefault
valueString[]CSS/UI class names to apply{}
exposeOn@QfExposeOn[]Per-app/capability exposure rules{}
conditions@QfConditionExpr[]Conditions under which the classes are applied{}

Condition Annotations

Condition annotations compose predicates used in conditions, showOn, disableOn, etc.

@QfConditionExpr

A condition expression defined as a flat token stream.

java
// A == "Y" AND (B IS NOT EMPTY OR C != "N")
@QfConditionExpr({
    @QfCondToken(type = QfCondTokenType.ATOM, atom = @QfCondition(attributeName = "a", equal = "Y")),
    @QfCondToken(type = QfCondTokenType.AND),
    @QfCondToken(type = QfCondTokenType.LPAREN),
    @QfCondToken(type = QfCondTokenType.ATOM, atom = @QfCondition(attributeName = "b", isNotEmpty = true)),
    @QfCondToken(type = QfCondTokenType.OR),
    @QfCondToken(type = QfCondTokenType.ATOM, atom = @QfCondition(attributeName = "c", notEqual = "N")),
    @QfCondToken(type = QfCondTokenType.RPAREN)
})
AttributeTypeDescriptionDefault
value@QfCondToken[]Ordered token stream forming the expression(required)

@QfCondToken / QfCondTokenType

One token in a condition expression.

AttributeTypeDescriptionDefault
typeQfCondTokenTypeToken type(required)
atom@QfConditionAtomic condition (used only when type is ATOM)@QfCondition

QfCondTokenType values: ATOM, AND, OR, LPAREN, RPAREN


@QfCondition

A single atomic comparison predicate.

AttributeTypeDescriptionDefault
sourceSourceWhere the comparison target value is resolved fromother_attribute_value
attributeNameStringTarget attribute name (used with other_attribute_value)""
masterEntityAttributeNameStringMaster entity attribute name (used with master_entity)""
equalStringEquality (=) comparison value""
notEqualStringInequality (!=) comparison value""
likeStringLIKE comparison pattern""
notLikeStringNOT LIKE comparison pattern""
inString[]IN comparison value list{}
notInString[]NOT IN comparison value list{}
lessThanStringLess-than (<) comparison value""
lessThanOrEqualStringLess-than-or-equal (<=) comparison value""
moreThanStringGreater-than (>) comparison value""
moreThanOrEqualStringGreater-than-or-equal (>=) comparison value""
haveStringPrivilege possession condition (used with privilege)""
notHaveStringPrivilege non-possession condition (used with privilege)""
isEmptybooleanIS EMPTY conditionfalse
isNotEmptybooleanIS NOT EMPTY conditionfalse
treeDepthintTree depth comparison value (used with tree_depth)-1

Source values: other_attribute_value, master_entity, user_info, tree_depth, privilege, app, menu, capability


File / Media Annotations

@QfFile

Declares file upload metadata for an attribute.

java
@QfFile(maxFiles = 5, accept = "image/*")
private String thumbnailId;
AttributeTypeDescriptionDefault
purposeStringFile purpose identifier"file_purpose.general"
maxFileSizelongMaximum file size in bytes (0 = unlimited)0
maxFilesintMaximum number of files1
acceptStringAccepted MIME types (e.g. "image/*")"*/*"
defaultImageStringDefault image path when no file is uploaded"thumb/defaultPicture.png"
usePrimarybooleanWhether to use the primary file onlyfalse

@QfZip

Declares a zip code (postal code) attribute. Automatically links to an address attribute for lookup integration.

java
@QfZip(addressAttributeName = "address", detailAddressAttributeName = "detailAddress")
private String zipCode;
AttributeTypeDescriptionDefault
addressAttributeNameStringAttribute name that receives the resolved address(required)
detailAddressAttributeNameStringAttribute name that receives the detail address""

Text Composition Annotations

@QfAffixes

Declares fixed prefix/suffix segments automatically prepended or appended on create/update.

java
@QfAffixes(
    prefixes = { @QfTextSegment(source = QfTextSegment.Source.static_value, value = "PREFIX-") },
    postfixes = { @QfTextSegment(source = QfTextSegment.Source.static_value, value = "-SUFFIX") }
)
private String code;
AttributeTypeDescriptionDefault
prefixes@QfTextSegment[]Prefix segment definitions{}
postfixes@QfTextSegment[]Postfix segment definitions{}

@QfTextSegment (element)

One segment in a composed text expression. Used as a nested element in @QfAffixes, @QfComposedText, etc.

AttributeTypeDescriptionDefault
sourceSourceWhere the segment value is resolved fromthis_attribute_value
valueStringStatic value or attribute name / lookup key depending on source""

Source values

ValueDescription
this_attribute_valueUses the current attribute's value
other_attribute_valueUses another attribute's value (specify via value)
user_infoUses information from the current user context
master_entityUses a value from the master entity
static_valueUses the literal string in value
unknownUnresolved / implementation-defined

View-Specific Attribute Annotations

@QfExcelAttribute

Declares that an attribute should be included in Excel export output.

java
@QfExcelAttribute(order = 1)
private String productName;
AttributeTypeDescriptionDefault
orderintColumn order in the Excel output0
exposeOn@QfExposeOn[]Per-app/capability exposure rules{}

@QfTreeAttribute

Declares that an attribute is exposed in tree view output.

java
@QfTreeAttribute(isName = true, sortable = true, order = 1)
private String categoryName;
AttributeTypeDescriptionDefault
isNamebooleanWhether this attribute serves as the tree node display namefalse
orderintColumn order in the tree view0
sortablebooleanWhether this column is sortable in tree viewfalse
exposeOn@QfExposeOn[]Per-app/capability exposure rules{}

Persistence Annotations

@QfAllowedDirectAccess

Permits direct data access that bypasses Q-Framework managed abstractions. Required when qf.persistence.access.mode is permissive (default).

java
@QfAllowedDirectAccess(reason = "SPI implementation — must read user store directly")
private final UserRepository userRepository;
AttributeTypeDescriptionDefault
reasonStringReason for the bypass (serves as audit record)""

Released under the Apache 2.0 License.