Ik heb hier een J2EE/JSF WebApp die via Hibernate met DB2 communiceert. De DB2 bevat 2 gerelateerde tabellen, waarvan de tweede tabel een FK heeft dat is gekoppeld aan de PK van de eerste tabel. Nu wil ik via Hibernate een search doen op de tweede tabel, waarbij de FK een eis is. Dit werkt prima, echter het is cacesensitive. Nu is dit op zich geen punt, aangezien Hibernate/DB2 een lower() functie kent, echter dat werkt niet wanneer ik de FK ook opgeef.
Eerst de relevante code:
MySecondTable.ddl
MySecondTable.java
MyBean.java
mybean.hbm.xml
Probleem
Wanneer de command binnen MyBean.java wordt uitgevoerd, dan krijg ik de volgende exceptie in de sysout:
Semi-oplossingen
Het werkt wél met de volgende mybean.hbm.xml test-configuraties:
lower() weglaten:
Probleemstelling
Het lijkt er dus op dat de firstTableId FK op een of andere manier dwars ligt met de lower() functie. Maar ik kom hier na 2 dagen troubleshooten nog steeds niet uit, ook niet mbv de online naslagwerken en de DB2 danwel Hibernate Reference Documentation
Enig inzicht?
Eerst de relevante code:
MySecondTable.ddl
SQL:
MyFirstTable.ddl is vergelijkbaar opgebouwd, maar dan zonder de FK.1
2
3
4
5
6
7
8
| CREATE TABLE MYSECONDTABLE ( ID BIGINT GENERATED ALWAYS AS IDENTITY CONSTRAINT MYSECONDTABLE_PK PRIMARY KEY, FIRSTTABLE_ID BIGINT NOT NULL, FIELD1 VARCHAR(255) NOT NULL, FIELD2 VARCHAR(255) NOT NULL, ... CONSTRAINT MYSECONDTABLE_FK FOREIGN KEY (FIRSTTABLE_ID) REFERENCES MYFIRSTTABLE (ID) ); |
MySecondTable.java
Java:
1
2
3
4
5
| private Long id; private Long firstTableId; private String field1; private String field2; // plus public getters en setters |
MyBean.java
Java:
getSearchFilter() retourneert gewoon een String dat door de gebruiker in het zoekveldje is opgegeven.1
2
3
4
5
6
| Map parameters = new HashMap(); parameters.put("firstTableId", getFirstTableId()); parameters.put("field1", "%" + getSearchFilter().toLowerCase() + "%"); parameters.put("field2", "%" + getSearchFilter().toLowerCase() + "%"); Command command = new QueryCommand(parameters, "MyFilter", MySecondTable.class); CommandInvoker.execute(command); |
mybean.hbm.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <hibernate-mapping package="mypackage.mywebapp"> <class name="MySecondTable" table="MYSECONDTABLE"> <id column="ID" name="id" type="long"> <generator class="identity" /> </id> <property column="FIRSTTABLE_ID" name="firstTableId" type="long" /> <property column="FIELD1" name="field1" /> <property column="FIELD2" name="field2" /> </class> <query name="MyFilter"> FROM MySecondTable table WHERE table.firstTableId = :firstTableId AND ( lower(table.field1) LIKE :field1 OR lower(table.field2) LIKE :field2 ) </query> </hibernate-mapping> |
Probleem
Wanneer de command binnen MyBean.java wordt uitgevoerd, dan krijg ik de volgende exceptie in de sysout:
org.hibernate.exception.SQLGrammarException: could not execute query Caused by: com.ibm.db2.jcc.a.SqlException: No authorized routine named "LOWER" of type "FUNCTION" having compatible arguments was found.
Semi-oplossingen
Het werkt wél met de volgende mybean.hbm.xml test-configuraties:
lower() weglaten:
XML:
Of table.firstTableId FK weglaten:1
2
3
4
5
6
7
8
| <query name="MyFilter"> FROM MySecondTable table WHERE table.firstTableId = :firstTableId AND ( table.field1 LIKE :field1 OR table.field2 LIKE :field2 ) </query> |
XML:
1
2
3
4
5
6
| <query name="MyFilter"> FROM MySecondTable table WHERE lower(table.field1) LIKE :field1 OR lower(table.field2) LIKE :field2 </query> |
Probleemstelling
Het lijkt er dus op dat de firstTableId FK op een of andere manier dwars ligt met de lower() functie. Maar ik kom hier na 2 dagen troubleshooten nog steeds niet uit, ook niet mbv de online naslagwerken en de DB2 danwel Hibernate Reference Documentation
Enig inzicht?
[ Voor 6% gewijzigd door BalusC op 02-06-2006 12:02 ]