一个nobrainer原本应该比我想象的要复杂一点,所以我希望有人可以提供帮助。
基本上我在SQL Server中有一个经典的订单数据库表,如:
CREATE TABLE [dbo].[order] (
[orderid] [bigint] NOT NULL,
[uniqueid] [uniqueidentifier] NOT NULL,
[revision] [int] NOT NULL,
<lots of other stuff...>
CONSTRAINT [PK_order] PRIMARY KEY ([orderid]),
CONSTRAINT [UK_order] UNIQUE ([uniqueid], [revision])
)
通过(uniqueid,revision)从SQL Management Studio查找订单就像梦一样
SELECT *
FROM [order]
WHERE [uniqueid] = '9E2822E9-4D08-4A25-8A86-ADAF8DB511CE' AND [revision] = 5;
返回适当的内容。
当我尝试从JPA框架访问orders表时出现问题。这是订单表的实体映射:
@Entity
@Table(name="[order]")
public class Order implements Serializable {
@Id
private long orderid;
private String uniqueid;
private int revision;
<lots of other stuff...>
}
通过orderid查找订单就像梦一样,说
public Order loadOrder(long orderid) {
return JPA.getManager().find(Order.class, orderid);
}
返回适当的内容。
当我尝试从我的JPA框架中检索(uniqueid,revision)订单时出现问题。这失败了:
public Order loadOrder(String uniqueid, int version) {
Query q = JPA.getManager().createQuery("SELECT o FROM Order o WHERE o.uniqueid=:uniqueid AND o.version=:version");
q.setParameter("uniqueid", uniqueid).setParameter("version", version);
...
}
带有java.sql.SQLException的:从字符串转换为uniqueidentifier时转换失败。 谷歌搜索SQLException消息产生了大量的结果,但都与生成唯一标识符有关。我没有产生任何东西 - 只是试图查找现有的价值。
我有一种唠叨的感觉,我错过了一些明显的东西,但我必须承认我被困住了。有帮助吗?
BTW JPA.getManager()返回javax.persistence.EntityManager的实例。
答案 0 :(得分:0)
我不熟悉SQL Server中的uniqueidentifier类型,似乎JPA也没有。
您可以尝试使用varchar类型。
JDBC驱动程序是否支持uniqueidentifier,如果它确实如何绑定类型?您可能需要进行一些转换。
如果您使用的是EclipseLink,则可以使用转换器。
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_converter.htm#CHDEHJEB