[J2EE] Hibernate/DB2 SQLGrammarException bij lower() icm FK

Pagina: 1
Acties:

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
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
SQL:
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)
);
MyFirstTable.ddl is vergelijkbaar opgebouwd, maar dan zonder de FK.

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:
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);
getSearchFilter() retourneert gewoon een String dat door de gebruiker in het zoekveldje is opgegeven.

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:
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>
Of table.firstTableId FK weglaten:
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 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
OMG, ik denk een bug te hebben gevonden :X Het werkt wel met de alias lcase() 8)7

http://publib.boulder.ibm...oc.sqlref/bjnrmstr247.htm
The LCASE function is identical to the LOWER function.
* BalusC slaat IBM.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 22:41
Het zou ook nog kunnen dat Hibernate verkeerde SQL code genereerde, of zag deze er wel goed uit?

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Nee, het lag uiteindelijk duidelijk aan DB2. Ook met plain commandconsole SQL kreeg ik SQLCODE -440 SQLSTATE 42884, wat dus op hetzelfde neerkomt: http://publib.boulder.ibm...udb.doc/core/rsql0400.htm

Vage bug.