You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by "Robert A. Decker" <de...@robdecker.com> on 2026/04/07 11:48:29 UTC
this works, but is there a better way?
I'm using single-table inheritance with the 'type' column determining the subclass with a Qualifier in the model:
AiSystemPrompt (abstract)
AiSystemPromptSummarization (Qualifier type='AiSystemPromptSummarization')
This query works:
List<AiJob> jobs = ObjectSelect.query(AiJob.class)
.where(AiJob.AI_SYSTEM_PROMPT.dot(AiSystemPrompt.TYPE).eq("AiSystemPromptSummarization"))
.select(context);
But I don't like that I'm hardcoding the subclass ("AiSystemPromptSummarization") and searching against the TYPE property.
Is there a way to do this using the attributes I have in the cayenne model? (abstract superclass with concrete subclass using the qualifier set in the entity model)
I looked at BaseProperty and a couple of others in org.apache.cayenne.exp.property but don't see it....
Rob
Re: this works, but is there a better way?
Posted by Michael Gentry <bl...@gmail.com>.
I think a custom enum is the better approach. You don't want someone
refactoring the class name and then your query no longer matches the DB
column entries.
On Tue, Apr 7, 2026 at 8:42 AM Andrus Adamchik <aa...@gmail.com> wrote:
> Oh, I got it. There are no special Cayenne shortcuts for this. So you'll
> have to use your own conventions
> (AiSystemPromptSummarization.class.getSimpleName(), or define possible
> constants in a custom enum).
>
> Andrus
>
>
>
> > On Apr 7, 2026, at 8:27 AM, Robert A. Decker <de...@robdecker.com>
> wrote:
> >
> > In my query I'm using a hardcoded string but if I change the qualifier
> in the cayenne modeler to, for example, use a different column or change
> the string in the qualifier it won't match the query.
> >
> > So, I should use the actual qualifier from the modeler but I don't see
> the qualifier in the class variables. Does it only live in the modeler?
> >
> > Basically I just don't want to use a string that I have in my code. I
> could use something like just the class name of the class but that may not
> match the qualifier.
> >
> > Rob
> >
> > Sent from my iPhone
> >
> >> On Apr 7, 2026, at 14:04, Andrus Adamchik <aa...@gmail.com> wrote:
> >>
> >> Hi Rob,
> >>
> >> In your example, both the entity qualifier and the condition in "where"
> seem the same. So you wouldn't need the latter if you have the former. Am I
> misreading the description?
> >>
> >> Andrus
> >>
> >>> On Apr 7, 2026, at 7:48 AM, Robert A. Decker <de...@robdecker.com>
> wrote:
> >>>
> >>> I'm using single-table inheritance with the 'type' column determining
> the subclass with a Qualifier in the model:
> >>> AiSystemPrompt (abstract)
> >>> AiSystemPromptSummarization (Qualifier
> type='AiSystemPromptSummarization')
> >>>
> >>> This query works:
> >>>
> >>> List<AiJob> jobs = ObjectSelect.query(AiJob.class)
> >>>
> .where(AiJob.AI_SYSTEM_PROMPT.dot(AiSystemPrompt.TYPE).eq("AiSystemPromptSummarization"))
> >>> .select(context);
> >>>
> >>> But I don't like that I'm hardcoding the subclass
> ("AiSystemPromptSummarization") and searching against the TYPE property.
> >>>
> >>> Is there a way to do this using the attributes I have in the cayenne
> model? (abstract superclass with concrete subclass using the qualifier set
> in the entity model)
> >>>
> >>> I looked at BaseProperty and a couple of others in
> org.apache.cayenne.exp.property but don't see it....
> >>>
> >>> Rob
> >>
>
>
Re: this works, but is there a better way?
Posted by Andrus Adamchik <aa...@gmail.com>.
Oh, I got it. There are no special Cayenne shortcuts for this. So you'll have to use your own conventions (AiSystemPromptSummarization.class.getSimpleName(), or define possible constants in a custom enum).
Andrus
> On Apr 7, 2026, at 8:27 AM, Robert A. Decker <de...@robdecker.com> wrote:
>
> In my query I'm using a hardcoded string but if I change the qualifier in the cayenne modeler to, for example, use a different column or change the string in the qualifier it won't match the query.
>
> So, I should use the actual qualifier from the modeler but I don't see the qualifier in the class variables. Does it only live in the modeler?
>
> Basically I just don't want to use a string that I have in my code. I could use something like just the class name of the class but that may not match the qualifier.
>
> Rob
>
> Sent from my iPhone
>
>> On Apr 7, 2026, at 14:04, Andrus Adamchik <aa...@gmail.com> wrote:
>>
>> Hi Rob,
>>
>> In your example, both the entity qualifier and the condition in "where" seem the same. So you wouldn't need the latter if you have the former. Am I misreading the description?
>>
>> Andrus
>>
>>> On Apr 7, 2026, at 7:48 AM, Robert A. Decker <de...@robdecker.com> wrote:
>>>
>>> I'm using single-table inheritance with the 'type' column determining the subclass with a Qualifier in the model:
>>> AiSystemPrompt (abstract)
>>> AiSystemPromptSummarization (Qualifier type='AiSystemPromptSummarization')
>>>
>>> This query works:
>>>
>>> List<AiJob> jobs = ObjectSelect.query(AiJob.class)
>>> .where(AiJob.AI_SYSTEM_PROMPT.dot(AiSystemPrompt.TYPE).eq("AiSystemPromptSummarization"))
>>> .select(context);
>>>
>>> But I don't like that I'm hardcoding the subclass ("AiSystemPromptSummarization") and searching against the TYPE property.
>>>
>>> Is there a way to do this using the attributes I have in the cayenne model? (abstract superclass with concrete subclass using the qualifier set in the entity model)
>>>
>>> I looked at BaseProperty and a couple of others in org.apache.cayenne.exp.property but don't see it....
>>>
>>> Rob
>>
Re: this works, but is there a better way?
Posted by "Robert A. Decker" <de...@robdecker.com>.
In my query I'm using a hardcoded string but if I change the qualifier in the cayenne modeler to, for example, use a different column or change the string in the qualifier it won't match the query.
So, I should use the actual qualifier from the modeler but I don't see the qualifier in the class variables. Does it only live in the modeler?
Basically I just don't want to use a string that I have in my code. I could use something like just the class name of the class but that may not match the qualifier.
Rob
Sent from my iPhone
> On Apr 7, 2026, at 14:04, Andrus Adamchik <aa...@gmail.com> wrote:
>
> Hi Rob,
>
> In your example, both the entity qualifier and the condition in "where" seem the same. So you wouldn't need the latter if you have the former. Am I misreading the description?
>
> Andrus
>
>> On Apr 7, 2026, at 7:48 AM, Robert A. Decker <de...@robdecker.com> wrote:
>>
>> I'm using single-table inheritance with the 'type' column determining the subclass with a Qualifier in the model:
>> AiSystemPrompt (abstract)
>> AiSystemPromptSummarization (Qualifier type='AiSystemPromptSummarization')
>>
>> This query works:
>>
>> List<AiJob> jobs = ObjectSelect.query(AiJob.class)
>> .where(AiJob.AI_SYSTEM_PROMPT.dot(AiSystemPrompt.TYPE).eq("AiSystemPromptSummarization"))
>> .select(context);
>>
>> But I don't like that I'm hardcoding the subclass ("AiSystemPromptSummarization") and searching against the TYPE property.
>>
>> Is there a way to do this using the attributes I have in the cayenne model? (abstract superclass with concrete subclass using the qualifier set in the entity model)
>>
>> I looked at BaseProperty and a couple of others in org.apache.cayenne.exp.property but don't see it....
>>
>> Rob
>
Re: this works, but is there a better way?
Posted by Andrus Adamchik <aa...@gmail.com>.
Hi Rob,
In your example, both the entity qualifier and the condition in "where" seem the same. So you wouldn't need the latter if you have the former. Am I misreading the description?
Andrus
> On Apr 7, 2026, at 7:48 AM, Robert A. Decker <de...@robdecker.com> wrote:
>
> I'm using single-table inheritance with the 'type' column determining the subclass with a Qualifier in the model:
> AiSystemPrompt (abstract)
> AiSystemPromptSummarization (Qualifier type='AiSystemPromptSummarization')
>
> This query works:
>
> List<AiJob> jobs = ObjectSelect.query(AiJob.class)
> .where(AiJob.AI_SYSTEM_PROMPT.dot(AiSystemPrompt.TYPE).eq("AiSystemPromptSummarization"))
> .select(context);
>
> But I don't like that I'm hardcoding the subclass ("AiSystemPromptSummarization") and searching against the TYPE property.
>
> Is there a way to do this using the attributes I have in the cayenne model? (abstract superclass with concrete subclass using the qualifier set in the entity model)
>
> I looked at BaseProperty and a couple of others in org.apache.cayenne.exp.property but don't see it....
>
> Rob