0

We're using Apache Cayenne to integrate an already existing MS SQL Server database with our application (I have no permission to change the database DDL, including the table/schema/database collation).

The database is using a specific collation (croatian) which defines single characters like "nj" and "dž", so when I do a LIKE query:

select * from table where name like '%N%'
I get zero results, on the other hand If i do:
select * from table where name like '%NJ%'
I get multiple results.

Obviously this is simple to fix by adding collate to the end of the query, but I know of no way of doing this with Cayenne. Any way to implement this without dropping the ORM-benefits as a whole?

tl;dr: Is there any way to preprocess queries before going to the database, like so:

query = query + ' collate SQL_Latin1_General_CP1_CI_AS'

adnan_e
  • 1,764
  • 2
  • 16
  • 25

1 Answers1

1

You can try to use custom DB adapter with custom SQL translator that will append required part to all select queries. Can be implemented like this for Cayenne 4.0:

public class CustomSQLServerAdapter extends SQLServerAdapter {

    public CustomSQLServerAdapter(/* all params */) {
        super(/* all params */);
    }

    @Override
    public SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver) {
        return new SQLServerSelectTranslator(query, this, entityResolver) {
            @Override
            protected void doTranslate() {
                super.doTranslate();
                sql += " collate SQL_Latin1_General_CP1_CI_AS";
            }
        };
    }
}

To use this adapter you can contribute custom detector for it (see docs) or set it directly in Modeler (data node -> adapter).

Nikita
  • 266
  • 2
  • 7