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

Surprise Paradox; [Books] Good Author List; [Computing] Efficient queries with grouping in Postgres; [Computing] Automatic Wake (Linux); [Computing] AWS CDK Aspects in Go; [Bike] Adidas Gravel Shoes; [Computing, Horror] Biological Chips; [Books] Weird Lit Recs; [Covid] Extended SIR Models; [Art] York-based Printmaker; [Physics] Quantum Transitions are not Instantaneous; [Computing] AI and Drum Machines; [Computing] Probabilities, Stopping Times, Martingales; bpftrace Intro Article; [Computing] Starlab Systems - Linux Laptops; [Computing] Extended Berkeley Packet Filter; [Green] Mainspring Linear Generator; Better Approach; Rummikub Solver; Chilean Poetry; Felicitations - Empowerment Grant; [Bike] Fixing Spyre Brakes (That Need Constant Adjustment); [Computing, Music] Raspberry Pi Media (Audio) Streamer; [Computing] Amazing Hack To Embed DSL In Python; [Bike] Ruta Del Condor (El Alfalfal); [Bike] Estimating Power On Climbs; [Computing] Applying Azure B2C Authentication To Function Apps; [Bike] Gearing On The Back Of An Envelope; [Computing] Okular and Postscript in OpenSuse; There's a fix!; [Computing] Fail2Ban on OpenSuse Leap 15.3 (NFTables); [Cycling, Computing] Power Calculation and Brakes; [Hardware, Computing] Amazing Pockit Computer; Bullying; How I Am - 3 Years Post Accident, 8+ Years With MS; [USA Politics] In America's Uncivil War Republicans Are The Aggressors; [Programming] Selenium and Python; Better Walking Data; [Bike] How Fast Before Walking More Efficient Than Cycling?; [COVID] Coronavirus And Cycling; [Programming] Docker on OpenSuse; Cadence v Speed; [Bike] Gearing For Real Cyclists; [Programming] React plotting - visx; [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

© 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