Andrew Cooke | Contents | Latest | RSS | Previous | Next

C[omp]ute

Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Choochoo Training Diary

Last 100 entries

[Programming] React Leaflet; AliExpress Independent Sellers; Applebaum - Twilight of Democracy; [Politics] Back + US Elections; [Programming,Exercise] Simple Timer Script; [News] 2019: The year revolt went global; [Politics] The world's most-surveilled cities; [Bike] Hope Freehub; [Restaurant] Mama Chau's (Chinese, Providencia); [Politics] Brexit Podcast; [Diary] Pneumonia; [Politics] Britain's Reichstag Fire moment; install cairo; [Programming] GCC Sanitizer Flags; [GPU, Programming] Per-Thread Program Counters; My Bike Accident - Looking Back One Year; [Python] Geographic heights are incredibly easy!; [Cooking] Cookie Recipe; Efficient, Simple, Directed Maximisation of Noisy Function; And for argparse; Bash Completion in Python; [Computing] Configuring Github Jekyll Locally; [Maths, Link] The Napkin Project; You can Masquerade in Firewalld; [Bike] Servicing Budget (Spring) Forks; [Crypto] CIA Internet Comms Failure; [Python] Cute Rate Limiting API; [Causality] Judea Pearl Lecture; [Security, Computing] Chinese Hardware Hack Of Supermicro Boards; SQLAlchemy Joined Table Inheritance and Delete Cascade; [Translation] The Club; [Computing] Super Potato Bruh; [Computing] Extending Jupyter; Further HRM Details; [Computing, Bike] Activities in ch2; [Books, Link] Modern Japanese Lit; What ended up there; [Link, Book] Logic Book; Update - Garmin Express / Connect; Garmin Forerunner 35 v 230; [Link, Politics, Internet] Government Trolls; [Link, Politics] Why identity politics benefits the right more than the left; SSH Forwarding; A Specification For Repeating Events; A Fight for the Soul of Science; [Science, Book, Link] Lost In Math; OpenSuse Leap 15 Network Fixes; Update; [Book] Galileo's Middle Finger; [Bike] Chinese Carbon Rims; [Bike] Servicing Shimano XT Front Hub HB-M8010; [Bike] Aliexpress Cycling Tops; [Computing] Change to ssh handling of multiple identities?; [Bike] Endura Hummvee Lite II; [Computing] Marble Based Logic; [Link, Politics] Sanity Check For Nuclear Launch; [Link, Science] Entropy and Life; [Link, Bike] Cheap Cycling Jerseys; [Link, Music] Music To Steal 2017; [Link, Future] Simulated Brain Drives Robot; [Link, Computing] Learned Index Structures; Solo Air Equalization; Update: Higher Pressures; Psychology; [Bike] Exercise And Fuel; Continental Race King 2.2; Removing Lowers; Mnesiacs; [Maths, Link] Dividing By Zero; [Book, Review] Ray Monk - Ludwig Wittgenstein: The Duty Of Genius; [Link, Bike, Computing] Evolving Lacing Patterns; [Jam] Strawberry and Orange Jam; [Chile, Privacy] Biometric Check During Mail Delivery; [Link, Chile, Spanish] Article on the Chilean Drought; [Bike] Extended Gear Ratios, Shimano XT M8000 (24/36 Chainring); [Link, Politics, USA] The Future Of American Democracy; Mass Hysteria; [Review, Books, Links] Kazuo Ishiguro - Never Let Me Go; [Link, Books] David Mitchell's Favourite Japanese Fiction; [Link, Bike] Rear Suspension Geometry; [Link, Cycling, Art] Strava Artwork; [Link, Computing] Useful gcc flags; [Link] Voynich Manuscript Decoded; [Bike] Notes on Servicing Suspension Forks; [Links, Computing] Snap, Flatpack, Appimage; [Link, Computing] Oracle is leaving Java (to die); [Link, Politics] Cubans + Ultrasonics; [Book, Link] Laurent Binet; VirtualBox; [Book, Link] No One's Ways; [Link] The Biggest Problem For Cyclists Is Bad Driving; [Computing] Doxygen, Sphinx, Breathe; [Admin] Brokw Recent Permalinks; [Bike, Chile] Buying Bearings in Santiago; [Computing, Opensuse] Upgrading to 42.3; [Link, Physics] First Support for a Physics Theory of Life; [Link, Bike] Peruvian Frame Maker; [Link] Awesome Game Theory Tit-For-Tat Thing; [Food, Review] La Fabbrica - Good Italian Food In Santiago; [Link, Programming] MySQL UTF8 Broken; [Link, Books] Latin American Authors

© 2006-2017 Andrew Cooke (site) / post authors (content).

iBatis Error with Recursive Generics

From: "andrew cooke" <andrew@...>

Date: Wed, 3 Sep 2008 13:10:01 -0400 (CLT)

I have a base class for ORM that looks something like this:

public class Keyed<KeyType extends Comparable<KeyType>>
implements Comparable<Keyed<KeyType>>
{
  private KeyType key;
  protected final void setKey(final KeyType key) {...}
  ...
}

For some reason, iBatis does not like this, even thought it was fine (as
far as I can tell) with an earlier version that was also generic (but did
not include the recursive Comparable declaration).

The error when you try to map (sublasses of) this is given below (in full
for Google).

I tried tracking what was causing this, and it seems that the type handler
is not inferred correctly while reading the configuration.  Rather than
digging further I found a simple workaround - specify the type handler by
hand.

So my maps now look like:

<sqlMap namespace="entity">
  <resultMap id="entity-result" class="...Entity">
    <result property="key" column="entity_id"
     typeHandler="com.ibatis.sqlmap.engine.type.StringTypeHandler"/>
    <result property="title" column="title"/>
    <result property="description" column="description"/>
    ...
  </resultMap>
  ...
</sqlMap>

Note the explicit typeHandler.

Andrew


03-Sep-2008 13:06:32 com.isti.kpidb.KpiDb getEntities
SEVERE: Failed to read Entities
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in maps/entity.xml.
--- The error occurred while applying a result map.
--- Check the entity.entity-result.
--- Check the result mapping for the 'key' property.
--- Cause: com.ibatis.sqlmap.client.SqlMapException: No type handler could
be found to map the property 'key' to the column 'entity_id'.  One or both
of the types, or the combination of types is not supported.
	at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:204)
	at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:139)
	at
com.ibatis.sqlmap.engine.mapping.statement.CachingStatement.executeQueryForList(CachingStatement.java:97)
	at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
	at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
	at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
	at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:94)
	at com.isti.kpidb.KpiDb.queryForList(KpiDb.java:331)
	at com.isti.kpidb.KpiDb.queryForList(KpiDb.java:311)
	at com.isti.kpidb.KpiDb.getEntities(KpiDb.java:102)
	at com.isti.kpidb.demo.ListEntities.execute(ListEntities.java:23)
	at com.isti.kpidb.demo.Demo.processInput(Demo.java:125)
	at com.isti.kpidb.demo.Demo.mainLoop(Demo.java:84)
	at com.isti.kpidb.demo.Demo.<init>(Demo.java:58)
	at com.isti.kpidb.demo.Demo.main(Demo.java:183)
Caused by: com.ibatis.sqlmap.client.SqlMapException: No type handler could
be found to map the property 'key' to the column 'entity_id'.  One or both
of the types, or the combination of types is not supported.
	at
com.ibatis.sqlmap.engine.mapping.result.ResultMap.getPrimitiveResultMappingValue(ResultMap.java:613)
	at
com.ibatis.sqlmap.engine.mapping.result.ResultMap.getResults(ResultMap.java:345)
	at
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:384)
	at
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:300)
	at
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:189)
	at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
	at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
	... 14 more

Probably due to Erasure

From: "andrew cooke" <andrew@...>

Date: Mon, 8 Sep 2008 19:36:57 -0400 (CLT)

I just realised what is causing this while looking through Wadler's book
to see if I could find something else (this is on p122).

The erased type for Keyed<KeyType extends Comparable<KeyType>>
 is going to be Comparable, rather than Object.  It would probably work OK
with Keyed<KeyType extends Object & Comparable<KeyType>>

Andrew

Confirmation - Type Erasure, not Recursion

From: "andrew cooke" <andrew@...>

Date: Thu, 11 Sep 2008 11:19:48 -0400 (CLT)

Just to confirm, the issue was type erasure, not the recursive generic
declaration.

Everything works fine (without explicit type handlers) if I use
  Keyed<KeyType extends Object & Comparable<KeyType>>
(with the leading "Object &")

Andrew

Still Not Simple

From: "andrew cooke" <andrew@...>

Date: Mon, 6 Oct 2008 15:43:49 -0400 (CLT)

It's not that simple, because iBatis will see a "Object" and use whatever
type it feels like.  This may not be consistent with the actual
implementation.

For example, I have a generic base class that has a "key" attribute.  When
used with Oracle, the integer key value was being set as a BigDecimal.  I
then got a class cast exception at some random moment when code that
compiled fine with <Integer> tried to access the BigDecimal key.

So the moral of the story is: either avoid generics, or give explicit type
handlers.  Since I like my Java code as it is, I'm going with the type
handlers for now.

Andrew

Comment on this post