angel
06/03/2026, 5:23 PMisHidden is returned as ishidden which breaks the consumer of the API (yes, I read the docs, not recommended to use Wheels for APIs). The only way to fix it that I've found is to create properties on the model via the property() function. I've tried using returnAs="structs" and returnAs="struct" which according to the documentation, should preserve case but it does not. Using renderText() does not work since the properties are all lower case coming out of the model. Is there a way to get the casing working like in CFWheels 2.5 via a configuration? I want to avoid modifying as much as the code as possible, thanks!Zain Ul Abideen
06/03/2026, 5:31 PMfindAll(returnAs="structs") results?
β’ renderWith() / renderText(serializeJSON(...))?Zain Ul Abideen
06/03/2026, 5:34 PMangel
06/03/2026, 5:38 PMfindAll(returnAs="structs") and both renderWith() / renderText(serializeJSON(...))angel
06/03/2026, 5:39 PMMicrosoft SQL Server (Vendor Microsoft)
13.2.1 app/extension for LuceeZain Ul Abideen
06/03/2026, 5:41 PMZain Ul Abideen
06/03/2026, 5:44 PMset(preservePropertyCase=true);Zain Ul Abideen
06/03/2026, 5:45 PMset(legacyPropertyCasing=true);angel
06/03/2026, 5:45 PMZain Ul Abideen
06/03/2026, 5:46 PMZain Ul Abideen
06/03/2026, 5:48 PMZain Ul Abideen
06/03/2026, 5:48 PMproperty(name="isHidden");angel
06/03/2026, 5:48 PMset(preservePropertyCase=true);
set(legacyPropertyCasing=true);angel
06/03/2026, 5:48 PMangel
06/03/2026, 5:48 PMangel
06/03/2026, 5:49 PMZain Ul Abideen
06/03/2026, 5:50 PMishidden
instead of
isHiddenangel
06/03/2026, 5:50 PMjTDS (MSSQL,Sybase) extension, same thingangel
06/03/2026, 5:51 PMZain Ul Abideen
06/03/2026, 5:51 PMZain Ul Abideen
06/03/2026, 5:52 PMproperty(name="isHidden");Zain Ul Abideen
06/03/2026, 5:52 PMangel
06/03/2026, 5:52 PMZain Ul Abideen
06/03/2026, 5:54 PMZain Ul Abideen
06/03/2026, 5:57 PMZain Ul Abideen
06/03/2026, 5:58 PMcomponent extends="Model" {
/**
* Auto-register properties from DB metadata.
*
* Call from config():
*
* autoProperties();
*/
public void function autoProperties() {
var tableName = variables.wheels.class.tableName;
var ds = application.wheels.dataSourceName;
var columns = queryExecute(
"
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = :tableName
ORDER BY ORDINAL_POSITION
",
{
tableName = {
value = tableName,
cfsqltype = "CF_SQL_VARCHAR"
}
},
{
datasource = ds
}
);
for (var row in columns) {
// Don't redefine existing properties.
if (
!structKeyExists(
variables.wheels.class.properties,
lCase(row.COLUMN_NAME)
)
) {
property(
name = row.COLUMN_NAME
);
}
}
}
}Zain Ul Abideen
06/03/2026, 5:58 PMZain Ul Abideen
06/03/2026, 5:58 PMpublic void function afterInitialization() {
if (
!structKeyExists(
variables.wheels.class,
"$autoPropertiesLoaded"
)
) {
autoProperties();
variables.wheels.class.$autoPropertiesLoaded = true;
}
}Zain Ul Abideen
06/03/2026, 5:59 PMangel
06/03/2026, 6:00 PMZain Ul Abideen
06/03/2026, 6:03 PMPeter Amiri
06/03/2026, 9:10 PMisHidden stayed isHidden. A change in the 3.0 line β originally aimed at Oracle, which reports column names in a fixed case β started normalizing all auto-derived property names to lowercase. So on SQL Server (and MySQL, etc.) isHidden now comes back as ishidden. That's why it reproduces no matter what you do at the output layer (returnAs="structs", renderText(serializeJSON(...))) β the casing is already gone by the time the model loads, before serialization runs. And just so you're not chasing it: there isn't a built-in config flag for this today.
What we're doing: changing it back so Wheels preserves your database's column casing by default (matching 2.5 behavior), and scoping the lowercasing to only the engine that actually needs it (Oracle). It's coming with a regression test + a cross-engine run so it stays fixed. This is landing in the 4.0 line.
Stopgap for right now: explicitly declaring the mixed-case properties restores the casing without waiting on the release β
property(name="isHidden", column="isHidden");
You'd only need it for the mixed-case ones, and the fix will remove the need for it entirely.
One thing that'll help us prioritize: are you moving to 3.0 as a stepping stone toward 4.0, or is 3.0 your target for now? If you're settling on 3.0 we'll look at backporting the fix to the 3.0 line; if 3.0 is mainly a waypoint to 4.0, we'd rather invest in a smoother 2.x β 4.0 upgrade path. Your answer genuinely shapes what we ship next.angel
06/04/2026, 12:26 PMprivate void function useDatabaseColumnCase() {
var columns = "";
cfdbinfo(
type = "columns",
table = tableName(),
datasource = get("dataSourceName"),
name = "columns"
);
for (var col in columns) {
property(name = col.column_name, column = col.column_name);
}
}
Place this function in the main model and then call it via the config function on the model:
public void function config() {
useDatabaseColumnCase();
}
This seems to be working. I know it adds overhead on initialization but we are ok with this.
I would focus on Wheels 4 and maybe put a note somewhere in the docs in case someone else runs into the issue.
This brings up a good question though. How long will Wheels 3 be supported?Zain Ul Abideen
06/04/2026, 8:34 PMPeter Amiri
06/09/2026, 2:43 AM