3131import dev .efekos .simple_ql .annotation .Unique ;
3232import dev .efekos .simple_ql .exception .NoGetterException ;
3333import dev .efekos .simple_ql .exception .NoSetterException ;
34- import dev .efekos .simple_ql .exception .TableException ;
3534import dev .efekos .simple_ql .implementor .Implementor ;
3635import dev .efekos .simple_ql .query .Query ;
3736import dev .efekos .simple_ql .query .QueryResult ;
@@ -93,11 +92,13 @@ public class Table<T extends TableRow<T>> {
9392 private <C > Class <C > grabClass (Implementor <C , ?> implementor ) {
9493 try {
9594 for (java .lang .reflect .Type type : implementor .getClass ().getGenericInterfaces ())
96- if (type instanceof ParameterizedType pt && pt .getRawType () == Implementor .class )
97- return (Class <C >) Class .forName (pt .getActualTypeArguments ()[0 ].getTypeName ());
95+ if (type instanceof ParameterizedType pt && pt .getRawType () == Implementor .class ) {
96+ java .lang .reflect .Type t = pt .getActualTypeArguments ()[0 ];
97+ return (Class <C >) Class .forName (t instanceof ParameterizedType ptt ? ptt .getRawType ().getTypeName () : t .getTypeName ());
98+ }
9899 return null ;
99100 } catch (Exception e ) {
100- throw new IllegalStateException ();
101+ throw new IllegalStateException (e . getMessage (), e );
101102 }
102103 }
103104
@@ -147,6 +148,7 @@ void checkExistent() {
147148 *
148149 * @param row {@link T} instance to clean.
149150 */
151+ @ SuppressWarnings ("unchecked" )
150152 void clean (T row ) {
151153 if (!row .isDirty ()) return ;
152154
@@ -156,7 +158,10 @@ void clean(T row) {
156158 row .getPrimaryField ().setAccessible (true );
157159 Optional <SetterAction <Object >> setter = findSetter (field .getType ());
158160 new UpdateActionThread (database .getConnection (), "UPDATE " + name + " SET " + field .getName () + "=? WHERE " + primaryKey .getName () + "= ?;" , stmt -> {
159- if (setter .isPresent ()) setter .get ().set (stmt , 1 , field .get (row ));
161+ if (setter .isPresent ()) {
162+ if (implementors .containsKey (field .getType ())) setter .get ().set (stmt , 1 , ((Implementor <Object ,Object >)implementors .get (field .getType ())).write (field .get (row )));
163+ else setter .get ().set (stmt , 1 , field .get (row ));
164+ }
160165 setField (row , row .getPrimaryField (), stmt , 2 );
161166 return stmt ;
162167 }).start ();
@@ -332,7 +337,7 @@ Optional<SetterAction<Object>> findSetter(Class<?> c) {
332337 if (c == byte .class || c == Byte .class )
333338 return Optional .of ((stmt , index , value ) -> stmt .setByte (index , (byte ) value ));
334339 if (c == long .class || c == Long .class )
335- return Optional .of ((stmt , index , value ) -> stmt .setByte (index , (byte ) value ));
340+ return Optional .of ((stmt , index , value ) -> stmt .setLong (index , (long ) value ));
336341 if (TableRowTypeAdapter .class .isAssignableFrom (c )) return Optional .of ((stmt , index , value ) -> {
337342 TableRowTypeAdapter adapter = (TableRowTypeAdapter ) value ;
338343 stmt .setString (index , adapter .adapt ());
0 commit comments