# Inject Values Using Hints

Sometimes an entity contains a property that is not mapped to a simple column, but instead holds some value fetched from another (joined) table or a value generated by query. For example, such property can holds some count or the result of some math operation, or value from other table.

We will use example where property `SentMessage.content` should be populated with value of `Message.ctx` (string value). Here is the T-SQL query that joins two tables and selects everything what is needed:

```sql
    select $C{sm.*}, $C{msg.ctx} from $T{SentMessage sm}
    join ($T{Message msg}) on ($msg.id=$sm.refId) where ...
```

Since `msg.ctx` string is not part of `SentMessage`, we can only call `DbOomQuery#list(SentMessage.class, String.class)` to receive data. But, this would be painful! The returned result for above T-SQL query is `List<Object[]>`, and in order to populate each `SentMessage.content` we would need to:

1. create a new `List<SentMessage>`.
2. iterate returned list of `Object[]`.
3. for each list element, cast array elements to `SentMessage` and

   `String`.
4. manually set property `content` of iterated `SentMessage` instance

   with string value.
5. add such prepared `SentMessage` to the new list.

Not only that it is unnecessary complicated, but also some additional memory is allocated to hold both lists in the same time.

### Using hints

Fortunately, *DbOom* framework comes with *hints*;) As explained elsewhere, hints can be used to instruct how returned values should be injected one into another.

So what would be the injection hint in our example? Its easy: for each row, please inject `msg.ctx` into `sm.content`. In the other words, we can say the following: map first columns of returned result into `sm` (`SentMessage`) and the last column put into `sm.content`.

Here is how to specify this hint in Java:

```java
    DbOomQuery q = query(sql(
            "select $C{sm.*}, $C{msg.ctx} as content from $T{SentMessage sm} " +
            "join ($T{Message msg}) on ($msg.id=$sm.refId) where..."));
    // set parameters
    List<SentMessage> list =
        q.withHints("sm", "sm.content").
            list(SentMessage.class, String.class);
```

And that is all! Here is how to read this in English: each record from resultset map into `SentMessage` and `String`, and name the first instance as "`sm`", while the second value, the string value, inject into `SentMessage`instance.

There is just one caveat - column name (specified with \\'`AS`\\' keyword) must match the property name.

Also note that returned value is `List<SentMessage>`, where each `SentMessage` has populated `content` property; so everything is ready for you :)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://db.jodd.org/object-mapping/inject-values-using-hints.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
